目录
基本框架
组件
事件处理机制
GUI常用组件
立即学习“Python免费学习笔记(深入)”;
按钮
菜单
菜单常用事件
静态文本和文本框
列表
单选与复选框
布局管理
sizer
使用sizer的步骤
其他GUI库
PyQt
Tkinter
PyGTK
创建一个简单的wxPython程序
代码语言:javascript代码运行次数:0运行复制import wxapp = wx.App() # 创建应用程序对象frame = wx.Frame(None, title = "Hello, World!") #创建一个框架frame.Show(True) # 显示窗口app.MainLoop() # 进入事件循化
运行结果如下所示:

利用我们之前讲的面向对象的方法,可以对这个代码进行修改,修改之后的代码如下所示:
本项目前后端分离,前端基于Vue+Vue-router+Vuex+Element-ui+Axios,参考小米商城实现。后端基于Node.js(Koa框架)+Mysql实现。前端包含了11个页面:首页、登录、注册、全部商品、商品详情页、关于我们、我的收藏、购物车、订单结算页面、我的订单以及错误处理页面。实现了商品的展示、商品分类查询、关键字搜索商品、商品详细信息展示、登录、注册、用户购物车、订单结算
1
import wxclass MyApp(wx.App): # 从App类里生子类 def OnInit(self): # 定义初始化方法 frame = wx.Frame(None, title="Hello, World!") # 创建一个框架 frame.Show() # 显示窗口 return Trueif __name__ == '__main__': app = MyApp() # 执行初始化方法 app.MainLoop()
具体的使用方法,如下所示:
代码语言:javascript代码运行次数:0运行复制import wxclass Frame1(wx.Frame): def __init__(self, superior): # 修改了原来Frame子类的__init__()方法 wx.Frame.__init__(self, parent=superior, title="一个可以输入的文本框", pos=(100, 200), size=(350, 200)) # 进行窗口标题、位置、大小的设置 panel = wx.Panel(self) # 通过Panel、TextCtrl增加一个文本输入框的位置 text1 = wx.TextCtrl(panel, value="Hello, World!", size=(350, 200)) # 把初始的文本内容设置为Hello, World!if __name__ == '__main__': app = wx.App() frame = Frame1(None) frame.Show(True) app.MainLoop()
运行结果如下所示:

具体代码如下所示:
代码语言:javascript代码运行次数:0运行复制import wxclass Frame1(wx.Frame): def __init__(self, superior): # 修改了原来Frame子类的__init__()方法 wx.Frame.__init__(self, parent=superior, title="一个可以输入的文本框", pos=(100, 200), size=(350, 200)) # 进行窗口标题、位置、大小的设置 self.panel = wx.Panel(self) # 通过Panel、TextCtrl增加一个文本输入框的位置 # text1 = wx.TextCtrl(self.panel, value="Hello, World!", size=(350, 200)) # 把初始的文本内容设置为Hello, World! self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick) # 将鼠标左键抬起事件(EVT_LEFT_UP)绑定到派生出的子类onClick()方法上 def OnClick(self, event): posm = event.GetPosition() # 获得鼠标单击的位置 wx.StaticText(parent=self.panel, label="Hello, World!", pos=(posm.x, posm.y)) # 放置一个静态的文本文件if __name__ == '__main__': app = wx.App() frame = Frame1(None) frame.Show(True) app.MainLoop()
运行结果如下所示:

菜单事件 – wx.EVT_MENU
代码语言:javascript代码运行次数:0运行复制…#绑定事件处理器 self.Bind(wx.EVT_MENU,self.OnClickBigger,biggerItem) self.Bind(wx.EVT_MENU,self.OnClickQuit,id=wx.ID_EXIT)…#事件处理器def OnClickBigger(self,e): passdef OnClickQuit(self,e): self.Close()…
具体实现如下代码所示,因为后续还会详细分析这段代码,就不展示运行结果。
代码语言:javascript代码运行次数:0运行复制import wxclass Frame1(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, title="Hello World in wxPython") panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) self.text1 = wx.TextCtrl(panel, value="Hello, World!", size=(200, 180), style=wx.TE_MULTILINE) # 创建了一个TextCtrl实例,也就是在panel中添加了一个文本框 sizer.Add(self.text1, 0, wx.ALIGN_TOP | wx.EXPAND) button = wx.Button(panel, label="Click Me") # 创建了一个Button实例,也就是在panel中添加了一个按钮 sizer.Add(button) panel.SetSizerAndFit(sizer) panel.Layout() self.Bind(wx.EVT_BUTTON, self.OnClick, button) # 把Button事件绑定在frame的OnClick()方法上 self.Show(True) def OnClick(self, text): self.text1.AppendText("\nHello, World!") # 添加字符串if __name__ == '__main__': app = wx.App() frame = Frame1(None) app.MainLoop()具体代码如下所示:
代码语言:javascript代码运行次数:0运行复制import wxclass Frame1(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, title="Hello World in wxPython") panel = wx.Panel(self) # 首先创建自动调用尺寸的容器 sizer = wx.BoxSizer(wx.VERTICAL) # 第二是创建一个sizer,这是一个BoxSizer的实例,方向是垂直方向 self.text1 = wx.TextCtrl(panel, value="Hello, World!", size=(200, 180), style=wx.TE_MULTILINE) # 第三是创建窗口组件,创建了一个TextCtrl实例,也就是在panel中添加了一个文本框 sizer.Add(self.text1, 0, wx.ALIGN_TOP | wx.EXPAND) # 第四是使用add方法加到sizer button = wx.Button(panel, label="Click Me") # 第三是创建窗口组件,创建了一个Button实例,也就是在panel中添加了一个按钮 sizer.Add(button) panel.SetSizerAndFit(sizer) # 最后调用容器的SetSizer()方法 panel.Layout() self.Bind(wx.EVT_BUTTON, self.OnClick, button) # 把Button事件绑定在frame的OnClick()方法上 self.Show(True) def OnClick(self, text): self.text1.AppendText("\nHello, World!") # 添加字符串if __name__ == '__main__': app = wx.App() frame = Frame1(None) app.MainLoop()运行结果如下所示:

具体代码如下所示:
代码语言:javascript代码运行次数:0运行复制import sysfrom PyQt5 import QtWidgetsclass TestWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle("Hello World!") self.outputArea = QtWidgets.QTextBrowser() self.helloButton = QtWidgets.QPushButton("Click Me") self.layout = QtWidgets.QVBoxLayout() self.layout.addWidget(self.outputArea) self.layout.addWidget(self.helloButton) self.setLayout(self.layout) self.helloButton.clicked.connect(self.sayHello) def sayHello(self): self.outputArea.append("Hello, World!")if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) testWidget = TestWidget() testWidget.show() sys.exit(app.exec_())运行结果如下所示:

优点:
文档比其他GUI库丰富与Qt、C++开发经验互通可使用大多数为Qt开发的组件有方便的周边工具支持PyQt, 如QtDesigner,Eric4缺点:
要注意避免内存泄露运行时庞大需要学习一些C++知识TkinterTkinter绑定了 Python 的 Tk GUI 工具集 ,通过内嵌在 Python 解释器内部的 Tcl 解释器实现 Tkinter 的调用转换成 Tcl 命令,然后交给 Tcl 解释器进行解释, 实现 Python 的 GUI 界面具体代码如下所示:
代码语言:javascript代码运行次数:0运行复制import tkinter as tkclass Tkdemo(object): def __init__(self): self.root = tk.Tk() self.txt = tk.Text(self.root, width=30, height=10) self.txt.pack() self.button = tk.Button(self.root, text='Click me', command=self.sayhello) self.button.pack() def sayhello(self): self.txt.insert(tk.INSERT, "Hello, World!\n")d = Tkdemo()d.root.mainloop()
运行结果如下所示:

优点:
历史最悠久, 是Python 事实上的标准GUI Python 中使用TkGUI工具集的标准接口,已包括在标准的Python Windows 安装中著名的 IDLE 用 Tkinter 实现 GUI创建的 GUI 简单,学起来和用起来也简单缺点:
性能不太好, 执行速度慢PyGTKPyGTK是一套GTK+ GUI库的Python封装pyGTK为创建桌面程序提供了一套综合的图形元素和其它使用的编程工具PyGTK是基于LGPL协议的免费软件许多 Gnome 下的著名应用程序的 GUI 都是使用 PyGTK 实现的,比如 BitTorrent , GIMP 和 Gedit 都有可选的实现在此就不展示PyGTK的代码,感兴趣的同学可以自己去学习。
优点:
底层的GTK+提供了各式的可视元素和功能能开发在GNOME桌面系统运行的功能完整的软件缺点:
在Windows平台表现不太好以上就是(九)Python GUI的基本框架的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号