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

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

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

和winform一样先导包

python 复制代码
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#一样.

cs 复制代码
using System;
using SC = System.Console;

是不是一模一样;

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

python 复制代码
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!")
python 复制代码
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只管传参数.

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

相关推荐
荣码1 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵12 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li14 小时前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸18 小时前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学19 小时前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
花酒锄作田1 天前
Pydantic校验配置文件
python
hboot1 天前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
ZhengEnCi2 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi2 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽2 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry