Skip to main content
 首页 » 编程设计

python之使用 tkinter 分配全局变量并销毁 gui

2024年10月25日33mate10pro

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

所以理想情况下,程序运行,弹出窗口,进行适当的属性选择,按钮上的文本被传递给“assign”函数,它创建一个要在我的程序中使用的全局变量,并且窗口消失。

就目前而言,运行此代码会导致错误:“TclError:无法调用“按钮”命令:应用程序已被销毁”。

如果我注释掉“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