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 元素

之间定义我的所有功能