当前位置: 首页 > news >正文

python用 PythonNet 从 Python 调用 WPF 类库 UI 用XAML

pythonnet 是pythonhe.net通用的神器不多介绍了.  

这次这基本上跟python没有关系了.

和winform一样先导包

import clr
clr.AddReference("PresentationFramework.Classic, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
clr.AddReference("PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
 
from System.Windows import Application
from System.Windows import Window
from System.Windows import MessageBox
from System.Windows import LogicalTreeHelper
from System.Windows.Markup import XamlReader
from System.Threading import Thread
from System.Threading import ApartmentState
from System.Threading import ThreadStart
from System import *
 

哈哈哈 有没有感觉和 C#一样.

using System;
using SC = System.Console;

是不是一模一样;

接下来:  写个类.  当然你可以用C#  VB.net单独做 成DLL也没关系. 重要的是先把婚结了 孩子生出来.  不对 先把东西生产出来.

class MainWindow(Window):
 
  def __init__(self):
    Window.__init__(self)
 
    #  XAML
    xaml = """
    <Page
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Grid>  
      <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
      </Grid.RowDefinitions>
      <Button Name="Button1" Grid.Row="0">Button 1</Button>
      <Button Name="Button2" Grid.Row="1">Button 2</Button>
      </Grid>
    </Page>
    """
    page = XamlReader.Parse(xaml)
 
    # connect Button1
    self.Button1 = LogicalTreeHelper.FindLogicalNode(page, "Button1")
    self.Button1.Click += self.Button1_Click
 
    # connect Button2
    self.Button2 = LogicalTreeHelper.FindLogicalNode(page, "Button2")
    self.Button2.Click += self.Button2_Click
 
    # 
    self.Title = "Python WPF App with XAML!"
    self.Width = 350
    self.Height = 300
    self.Content = page
 
  def Button1_Click(self, sender, e):
    MessageBox.Show(self.Button1.Content + " is clicked!")
 
  def Button2_Click(self, sender, e):
    MessageBox.Show(self.Button2.Content + " is clicked!")

def STAMain():
  app = Application()
  app.Run(MainWindow())
 
def main():
  t = Thread(ThreadStart(STAMain))
  t.ApartmentState = ApartmentState.STA
  t.Start()
  t.Join()
 
if __name__ == "__main__":
  main()

界面一定要线程里面; 要不然python解释器会卡死.

当然 你也可以这么干;用C#界面类库打包写成DLL在用python调用. python只管传参数.

对于性能要求不高的场合就很合适.

相关文章:

  • 支持向量机 (Support Vector Machine, SVM)
  • ProfiNet转EtherNet/IP罗克韦尔PLC与监控系统通讯案例
  • hydra docker版本
  • 云原生监控体系建设:Kubernetes架构下的全面监控策略
  • DeepSeek R1本地Linux服务器Docker部署<实现网页访问/本地终端访问>完整教程
  • vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点
  • CentOS7设置静态IP
  • 细分数字货币钱包的不同种类
  • CSS文本属性
  • 网工项目实践2.4 北京公司安全加固、服务需求分析及方案制定
  • CSS基础(浮动、相对定位、绝对定位、固定定位、粘性定位、版心、重置默认样式)
  • 22爬虫:使用Drission Page的两个案例
  • 网络安全高级软件编程技术
  • Java八股文(下)
  • Mac安装配置Tomcat 8
  • C++栈与队列:数据结构的“单行道”与“流水线
  • QML Component 与 Loader 结合动态加载组件
  • ES6相关操作
  • Typora的Github主题美化
  • 代码随想录算法训练day59---图论系列4
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开“无条件谈判”
  • 上海这个咖啡文化节首次“走出去”,率本土品牌亮相英国伦敦
  • 陈刚:推动良好政治生态和美好自然生态共生共优相得益彰
  • 有关“普泽会”,俄官方表示:有可能
  • 美联储计划裁员约10%
  • “走进书适圈”:一周城市生活