首先,我知道这不是一个问题,但我真的需要帮助
我有一个在CLI中运行良好的程序,但现在我开始用tkinter编写GUI。我创建了一个方法来创建一个窗口并接收程序其余部分的日期。我的代码如下
def getDate():
global dayVar
global dayMenu
global yearVar
global yearMenu
global monthVar
global monthMenu
rt = Tk()
print(rt.state())
print(rt)
rt.resizable(width=False, height=False)
rt.minsize(height=200, width=400)
rt.title("Selecionar Data...")
rt.update()
rt.attributes("-topmost", True)
rt.attributes("-topmost", False)
Grid.rowconfigure(rt, 0, weight=1)
Grid.columnconfigure(rt, 0, weight=1)
frameTop = Frame(rt)
frameTop.grid(row=0,column=0)
dayVar = IntVar(rt)
monthVar = StringVar(rt)
yearVar = IntVar(rt)
dayVar.set(1)
monthVar.set("Janeiro")
yearVar.set(2015)
dayMenu = OptionMenu(frameTop, dayVar, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,31)
monthMenu = OptionMenu(frameTop, monthVar, "Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro","Dezembro")
yearMenu = OptionMenu(frameTop, yearVar, "")
for i in range(2015, datetime.datetime.today().year + 1):
# Add a new item (i - in this case an int) to the option menu
yearMenu['menu'].add_command(label=i, command=_setit(yearVar, i))
yearVar.set(2015)
#PACKING/GRIDING
Label(frameTop, text="Dia").grid(row=0,column=0,sticky=NSEW)
Label(frameTop, text="Mes").grid(row=1,column=0,sticky=NSEW)
Label(frameTop, text="Ano").grid(row=2,column=0,sticky=NSEW)
dayMenu.grid(row=0,column=1,sticky=NSEW)
monthMenu.grid(row=1,column=1,sticky=NSEW)
yearMenu.grid(row=2,column=1,sticky=NSEW)
frameBottom = Frame(rt)
frameBottom.grid(row=1,column=0)
b = Button(rt, text="Próximo", command=rt.destroy)
b.grid(row=1)
rt.mainloop(1)
问题是,如果我在运行该方法时不使用程序的其余部分,它将加载并完美地显示窗口。当我运行整个代码时,它不会以任何方式运行。奇怪的是,它没有显示错误,也没有崩溃,如果我在创建和插入窗口内容的代码中插入大量打印(rt是我的窗口变量=>rt=Tk()“)所有的命令都被打印出来,因为它忽略了我在tkinter中的所有命令
如果你知道会发生什么事,我很乐意听听。我认为我破坏了以前的窗口并使用相同的var来创建这个新窗口是问题所在,所以我更改了var名称。它不起作用
如果有人想看完整的代码,尽管问。我不会先把它贴出来,因为它太大了,我真的希望问题就在这里。 提前谢谢
我已经找到了解决方案,感谢jasonharper解释了为什么不反复使用Tk()方法
我正在使用Tk.destroy(),实例正在被销毁,它得到的引用太多了。这就是为什么代码在创建窗口时忽略了我的新尝试。我发现当我使用Tk.quit()时,窗口关闭,当我再次使用Tk()时,它会创建一个新窗口
也许这不是正确的方法,但现在我就这样离开。 有一个更好的方法来删除和创建窗口,我将研究实现收回和使用标签或框架来显示和隐藏东西的可能性
可能还有其他问题,但其中一个肯定是:
以上与此完全相同:
换句话说,您在创建窗口时会立即调用
_setit
。如果该函数有破坏窗口的副作用,您将得到所描述的行为command
属性需要一个可调用的函数引用。如果需要将参数传递给函数,则通常使用lambda
创建闭包:相关问题 更多 >
编程相关推荐