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

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只管传参数.

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


http://www.kler.cn/a/556524.html

相关文章:

  • Android JNI的理解与使用。
  • 单片机 code RO-data RW-data ZI-data以及OTA学习
  • DeepSeek本地部署WebUI可视化数据投喂训练AI
  • android13修改系统Launcher不跟随重力感应旋转
  • 深入理解ES6核心特性:现代JavaScript开发的基石
  • 分布式 IO 模块:造纸设备的降本增效利器
  • BERT 大模型
  • LeetCode 2209.用地毯覆盖后的最少白色砖块:记忆化搜索之——深度优先搜索(DFS)
  • 机器学习 - 衡量模型的特性
  • uniapp引入uview组件库(可以引用多个组件)
  • 【机器学习】多元线性回归算法和正规方程解求解
  • 域内证书维权
  • 基于Python+Django+Vue的旅游景区推荐系统系统设计与实现源代码+数据库+使用说明
  • STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(二)
  • 不同安装路径重复R包清理
  • 解耦的艺术_应用架构中的解耦
  • 2024年职高单招或高考计算机类投档线
  • 【AI】openEuler 22.03 LTS SP4安装 docker NVIDIA Container Toolkit
  • 在nodejs中使用ElasticSearch(二)核心概念,应用
  • c++17 std::timespec_get 简介