使用tkinter赋值一个全局变量并销毁gui



我一直在编写一个年度数据验证程序,需要一些用户输入,因此决定采用更简便的方法。我已经为其中一个用户输入屏幕创建了界面,并且必须创建其他界面,但是我遇到了一些问题,即在进行选择后破坏窗口,以及变量的全球化。

因此,理想情况下,程序运行,窗口弹出,做出适当的属性选择,按钮上的文本被传递给"assign"函数,该函数创建一个用于我的程序的全局变量,窗口消失。

现在,运行这段代码会导致一个错误:"TclError:不能调用"button"命令:应用程序已被销毁"。

如果我注释掉"mGui.destroy()"行,我可以选择一个按钮并手动关闭窗口,但是"DRN"变量无论如何都传递给变量"x"!

import sys
from Tkinter import *
def assign(value):
    global x
    x = value
    mGui.destroy()
mGui = Tk()
mGui.geometry("500x100+500+300")
mGui.title("Attribute Selection Window")
mLabel = Label(mGui, text = "Please select one of the following attributes to assign to the selected Convwks feature:").pack()
mButton = Button(mGui, text = "CON", command = assign("CON")).pack()
mButton = Button(mGui, text = "MS", command = assign("MS")).pack()
mButton = Button(mGui, text = "DRN", command = assign("DRN")).pack()
mGui.mainloop()     #FOR WINDOWS ONLY

附加问题:将所有按钮放在同一行,它们之间有空格,同时保持它们居中

代码的问题是在添加按钮命令时不能调用函数。不能写Button(command=function()),只能写Button(command=function)。如果你想给函数传递一个参数,你必须这样做:

而不是:

mButton = Button(mGui, text = "CON", command = assign("CON")).pack()
mButton = Button(mGui, text = "MS", command = assign("MS")).pack()
mButton = Button(mGui, text = "DRN", command = assign("DRN")).pack()

你必须写:

mButton = Button(mGui, text = "CON", command = lambda: assign("CON")).pack()
mButton = Button(mGui, text = "MS", command = lambda: assign("MS")).pack()
mButton = Button(mGui, text = "DRN", command = lambda: assign("DRN")).pack()

如果你想把所有的按钮放在同一行,你可以使用下面的代码:

import sys
from Tkinter import *
def assign(value):
    global x
    x = value
    mGui.destroy()
mGui = Tk()
mGui.geometry("500x100+500+300")
mGui.title("Attribute Selection Window")
frame1 = Frame(mGui)
frame1.pack()
mLabel = Label(frame1, text = "Please select one of the following attributes to assign to the selected Convwks feature:").grid(row=0, column=0)
frame2 = Frame(mGui)
frame2.pack()

mButton = Button(frame2, text = "CON", command = lambda: assign("CON")).grid(row=0, column=0, padx=10)
mButton = Button(frame2, text = "MS", command = lambda: assign("MS")).grid(row=0, column=1, padx=10)
mButton = Button(frame2, text = "DRN", command = lambda: assign("DRN")).grid(row=0, column=2, padx=10)
mGui.mainloop()     #FOR WINDOWS ONLY

相关内容

  • 没有找到相关文章

最新更新