文章目录
1、实现一个简单的GUI窗口
"""
(1)一个GUI小窗口
"""
import wx
# (1)定义一个应用程序类对象
app = wx.App()
# (2)创建一个顶级窗口
window = wx.Frame(None, title="一个GUI小窗口", size=(300, 500))
# (3)定义一个panel对象,相当于一个容器,用来管理元素
panel = wx.Panel(window)
# (4)添加一个静态文本
wx.StaticText(panel, label="骚年,你准备好了吗?", pos=(100, 200))
# (5)激活框架窗口
window.Show(True)
# (6)运行APP
app.MainLoop()
2、实现2个数运算的GUI窗口
"""
(2) 实现2个数的运算
"""
import wx
# a、定义按钮触发事件函数
def calculator(event):
# 获取控件num1的数据
number1 = num1.GetValue()
# 获取控件operator的数据
oper = operator.GetValue()
# 获取控件num2的数据
number2 = num2.GetValue()
# 数据处理
if oper == "+":
r = int(number1) + int(number2)
if oper == "-":
r = int(number1) - int(number2)
if oper == "*":
r = int(number1) * int(number2)
if oper == "/":
r = float(number1) / int(number2)
# 将处理结果放入控件result中
result.SetValue(number1+oper+number2+"="+str(r))
# (1)控件定义
app = wx.App() # 定义一个应用程序
window = wx.Frame(None, title="简易计算", size=(500, 400)) # 定义一个窗体
panel = wx.Panel(window) # 定义一个容器
num1 = wx.TextCtrl(panel) # 定义文本框1
operator = wx.TextCtrl(panel) # 定义文本框2
num2 = wx.TextCtrl(panel) # 定义文本框3
result = wx.TextCtrl(panel) # 定义文本框3
button = wx.Button(panel, label="ok") # 定义按钮
# (2)控件布局
# a、定义BoxSizer1,依次加入控件到boxsizer中
boxsizer1 = wx.BoxSizer(wx.HORIZONTAL)
boxsizer1.Add(num1, proportion=1, border=8, flag=wx.LEFT) # 左侧留出8个像素的大小空间
boxsizer1.Add(operator, proportion=3, border=8, flag=wx.LEFT | wx.RIGHT) # 左右2侧都流出空格
boxsizer1.Add(num2, proportion=2, border=8, flag=wx.LEFT)
# b、定义boxsizer2,将boxsizer1嵌套到2里面
boxsizer2 = wx.BoxSizer(wx.VERTICAL)
boxsizer2.Add(boxsizer1, flag=wx.EXPAND | wx.TOP, border=8)
boxsizer2.Add(button, flag=wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, border=8)
boxsizer2.Add(result, proportion=1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP | wx.BOTTOM, border=8)
# c、执行布局设置2
panel.SetSizer(boxsizer2)
# (3)按钮绑定事件
# b、绑定按钮
button.Bind(wx.EVT_BUTTON, calculator)
# (4)运行GUI工具
window.Show(True) # 激活显示窗口
app.MainLoop() # 运行程序
3、面向对象结构优化
# 使用面向对象思想进行GUI运算器得实现
import wx
# 定义类
class cal_GUI:
# 类的初始化方法,创建app及控件
def __init__(self):
# 创建一个app
self.app = wx.App()
self.window = wx.Frame(None, title="计算器_tfjiao", size=(500, 300))
self.panel = wx.Panel(self.window)
# 创建控件
self.txtNum1 = wx.TextCtrl(self.panel)
self.txtoperator = wx.TextCtrl(self.panel)
self.txtNum2 = wx.TextCtrl(self.panel)
self.txtResult = wx.TextCtrl(self.panel)
self.butOK = wx.Button(self.panel, label="OK")
# 布局并生效控件
def layout(self):
# (1)布局一个水平box,有3个控件
box1 = wx.BoxSizer(wx.HORIZONTAL)
box1.Add(self.txtNum1, proportion=10, flag=wx.LEFT, border=8)
box1.Add(self.txtoperator, proportion=1, flag=wx.LEFT, border=8)
box1.Add(self.txtNum2, proportion=10, flag=wx.LEFT | wx.RIGHT, border=8)
# (2)布局一个竖直box,有3个控件
box2 = wx.BoxSizer(wx.VERTICAL)
box2.Add(box1, flag=wx.EXPAND | wx.BOTTOM | wx.TOP, border=8)
box2.Add(self.butOK, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=8)
box2.Add(self.txtResult, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=8, proportion=1)
# (3)生效box
self.panel.SetSizer(box2)
# 数据处理1、2、3
def cal_event(self, event):
# a、获取界面输入的值
num1 = self.txtNum1.GetValue()
oper = self.txtoperator.GetValue()
num2 = self.txtNum2.GetValue()
# b、根据运算符进行处理
if oper == "+":
r = int(num1) + int(num2)
if oper == "-":
r = int(num1) - int(num2)
if oper == "*":
r = int(num1) * int(num2)
if oper == "/":
r = float(num1) / int(num2)
# c、将处理结果放入控件txtResult中
self.txtResult.SetValue(num1 + oper + num2 + "=" + str(r))
# 将数据处理的方法,绑定在指定按钮上
def bind_set(self):
self.butOK.Bind(wx.EVT_BUTTON, self.cal_event) # 类里面调用函数,不用带括号
# 运行app
def run(self):
self.window.Show(True)
self.app.MainLoop()
if __name__ == '__main__':
a = cal_GUI()
a.layout()
a.bind_set()
a.run()
4、问题
问题1:报错UnboundLocalError: local variable ‘r’ referenced before assignment
在定义布局时候,这两行代码得顺序搞反了
operator = wx.TextCtrl(panel) # 定义文本框2
num2 = wx.TextCtrl(panel) # 定义文本框3