Python 一般 GUI 概念
Python General GUI concepts
我从一些 Python (tkinter) GUI 项目开始,但我觉得我在这里的代码组织中缺少一些基本概念。
例如,我有一个部分用于定义 GUI 元素(输入字段、按钮等),还有一个部分用于定义将由 GUI 元素调用的函数。但是,我发现自己处于第 22 条陷阱,因为如果我先定义 GUI 元素,然后我会得到一个错误,指出我指的是未定义的函数,如果我先定义函数(例如,在字段 y 中显示 x 的值),我会得到一个未定义 GUI 字段的错误。
假设使用下面的代码,我想在按下按钮时更新 2 个标签的值
#defining the GUI elements
labelhighvalue1d_ticker1 = Label(root, text=" Value 1 ")
labelhighvalue1d_ticker1.grid(row=1, column=6)
labelhighvalue_lt_ticker1 = Label(root, text=" Value 2 ")
labelhighvalue_lt_ticker1.grid(row=1, column=7)
placetrade3 = tk.Button(root, text='Get Data', command=updatelabelsvalue)
placetrade3.grid(row=3, column=5)
def calculatevalues():
return value1, value2
calculatevalues()
def updatelabelsvalue(value1, value2):
labelhighvalue1d_ticker1 = Label(root, text=value1)
labelhighvalue_lt_ticker1 = Label(root, text=value2)
定义按钮时函数尚未定义 -> 错误。
如果我一开始就定义了小说,那么标签还没有定义 -> 错误。
如有任何快速指导或相关建议阅读,我们将不胜感激。
If I define the fiction at the beginning then the labels are not yet defined -> error.
Python 是一种解释型语言,这意味着 Python 程序的源代码被转换为字节码,然后由 Python 虚拟机执行,而不是编译器, function updatelabelsvalue
下的语句直到这个function被调用才会被检查,所以如果你在开头定义function就不会报错。
您的代码无效,因此请在此处修改。
from tkinter import *
def updatelabelsvalue(value1, value2):
labelhighvalue1d_ticker1.configure(text=" Value 3 ")
labelhighvalue_lt_ticker1.configure(text=" Value 4 ")
root = Tk()
#defining the GUI elements
labelhighvalue1d_ticker1 = Label(root, text=" Value 1 ")
labelhighvalue1d_ticker1.grid(row=0, column=0)
labelhighvalue_lt_ticker1 = Label(root, text=" Value 2 ")
labelhighvalue_lt_ticker1.grid(row=1, column=0)
placetrade3 = Button(root, text='Get Data', command=lambda value1=" Value 3 ", value2=" Value 4 ":updatelabelsvalue(value1, value2))
placetrade3.grid(row=2, column=0)
root.mainloop()
你缺少的是对事件驱动编程的理解。基本上,GUI 编程是基于事件的。当您 运行 您的示例代码时,所有代码都会一次性执行,并在到达 mainloop()
时暂停,也就是事件开始处理的时候。要使 GUI 保持 活动状态 ,它需要能够处理事件。
您应该做的是,创建一个按钮(只是一种在单击按钮时触发事件的方法),然后 运行 在单击按钮时使用此函数。因此,通过这种方式,您将能够创建一个事件,该事件将获取 return 值并更新标签, 创建小部件后(代码已命中 mainloop
并开始处理事件).
#defining the GUI elements
labelhighvalue1d_ticker1 = Label(root, text=" Value 1 ")
labelhighvalue1d_ticker1.grid(row=1, column=6)
labelhighvalue_lt_ticker1 = Label(root, text=" Value 2 ")
labelhighvalue_lt_ticker1.grid(row=1, column=7)
def calculatevalues():
return value1, value2
def updatelabelsvalue(): # Removed the parameters here
val1,val2 = calculatevalues() # Run the function and get the return values and unpack into variables
# Configure the text of the labels with the new text, rather than creating new labels
labelhighvalue1d_ticker.config(text=val1)
labelhighvalue_lt_ticker1.config(text=val2)
placetrade3 = tk.Button(root, text='Get Data', command=updatelabelsvalue)
placetrade3.grid(row=3, column=5)
所以现在只要 updatelabelsvalue
是 运行,您就不会收到任何错误,因为小部件已经创建。另外,我喜欢在 root
和创建 GUI 元素
之间定义我的所有功能
我从一些 Python (tkinter) GUI 项目开始,但我觉得我在这里的代码组织中缺少一些基本概念。
例如,我有一个部分用于定义 GUI 元素(输入字段、按钮等),还有一个部分用于定义将由 GUI 元素调用的函数。但是,我发现自己处于第 22 条陷阱,因为如果我先定义 GUI 元素,然后我会得到一个错误,指出我指的是未定义的函数,如果我先定义函数(例如,在字段 y 中显示 x 的值),我会得到一个未定义 GUI 字段的错误。
假设使用下面的代码,我想在按下按钮时更新 2 个标签的值
#defining the GUI elements
labelhighvalue1d_ticker1 = Label(root, text=" Value 1 ")
labelhighvalue1d_ticker1.grid(row=1, column=6)
labelhighvalue_lt_ticker1 = Label(root, text=" Value 2 ")
labelhighvalue_lt_ticker1.grid(row=1, column=7)
placetrade3 = tk.Button(root, text='Get Data', command=updatelabelsvalue)
placetrade3.grid(row=3, column=5)
def calculatevalues():
return value1, value2
calculatevalues()
def updatelabelsvalue(value1, value2):
labelhighvalue1d_ticker1 = Label(root, text=value1)
labelhighvalue_lt_ticker1 = Label(root, text=value2)
定义按钮时函数尚未定义 -> 错误。
如果我一开始就定义了小说,那么标签还没有定义 -> 错误。
如有任何快速指导或相关建议阅读,我们将不胜感激。
If I define the fiction at the beginning then the labels are not yet defined -> error.
Python 是一种解释型语言,这意味着 Python 程序的源代码被转换为字节码,然后由 Python 虚拟机执行,而不是编译器, function updatelabelsvalue
下的语句直到这个function被调用才会被检查,所以如果你在开头定义function就不会报错。
您的代码无效,因此请在此处修改。
from tkinter import *
def updatelabelsvalue(value1, value2):
labelhighvalue1d_ticker1.configure(text=" Value 3 ")
labelhighvalue_lt_ticker1.configure(text=" Value 4 ")
root = Tk()
#defining the GUI elements
labelhighvalue1d_ticker1 = Label(root, text=" Value 1 ")
labelhighvalue1d_ticker1.grid(row=0, column=0)
labelhighvalue_lt_ticker1 = Label(root, text=" Value 2 ")
labelhighvalue_lt_ticker1.grid(row=1, column=0)
placetrade3 = Button(root, text='Get Data', command=lambda value1=" Value 3 ", value2=" Value 4 ":updatelabelsvalue(value1, value2))
placetrade3.grid(row=2, column=0)
root.mainloop()
你缺少的是对事件驱动编程的理解。基本上,GUI 编程是基于事件的。当您 运行 您的示例代码时,所有代码都会一次性执行,并在到达 mainloop()
时暂停,也就是事件开始处理的时候。要使 GUI 保持 活动状态 ,它需要能够处理事件。
您应该做的是,创建一个按钮(只是一种在单击按钮时触发事件的方法),然后 运行 在单击按钮时使用此函数。因此,通过这种方式,您将能够创建一个事件,该事件将获取 return 值并更新标签, 创建小部件后(代码已命中 mainloop
并开始处理事件).
#defining the GUI elements
labelhighvalue1d_ticker1 = Label(root, text=" Value 1 ")
labelhighvalue1d_ticker1.grid(row=1, column=6)
labelhighvalue_lt_ticker1 = Label(root, text=" Value 2 ")
labelhighvalue_lt_ticker1.grid(row=1, column=7)
def calculatevalues():
return value1, value2
def updatelabelsvalue(): # Removed the parameters here
val1,val2 = calculatevalues() # Run the function and get the return values and unpack into variables
# Configure the text of the labels with the new text, rather than creating new labels
labelhighvalue1d_ticker.config(text=val1)
labelhighvalue_lt_ticker1.config(text=val2)
placetrade3 = tk.Button(root, text='Get Data', command=updatelabelsvalue)
placetrade3.grid(row=3, column=5)
所以现在只要 updatelabelsvalue
是 运行,您就不会收到任何错误,因为小部件已经创建。另外,我喜欢在 root
和创建 GUI 元素