Tkinter意外行为,方法没有创建窗口

时间:2017-08-10 18:05:38

标签: python user-interface methods tkinter

首先,我知道这不是一个问题,但确实需要帮助。

我有一个在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是我的窗口的var =>" rt = Tk( )")所有这些都被打印出来,因为它忽略了我在tkinter中的所有命令。

如果对可能发生的事情有任何想法,我很乐意听到。我认为我销毁前一个窗口并使用相同的var来创建这个新窗口的事实是问题,所以我更改了var名称。它不起作用

如果有人要求查看整个代码,请问。我不会先发布它,因为它太大了,我真的希望问题出在这里。 提前谢谢

2 个答案:

答案 0 :(得分:1)

可能还有其他问题,但肯定有一个:

yearMenu['menu'].add_command(label=i, command=_setit(yearVar, i))

以上内容完全相同:

result = _setit(yearVar, i)
yearMenu['menu'].add_command(label=i, command=result)

换句话说,您在创建窗口时立即调用_setit。如果该函数具有破坏窗口的副作用,您将获得您描述的行为。

command属性需要可调用 - 对函数的引用。如果您需要将参数传递给函数,那么创建一个lambda的闭包是很常见的:

...add_command(...command=lambda i=i: _setit(yearVar, i))

答案 1 :(得分:0)

我找到了解决方案,感谢jasonharper解释为什么不反复使用Tk()方法。

我正在使用Tk.destroy()并且实例正在被销毁,并且它获得了很多参考。这就是为什么代码忽略了我在创建窗口时的新尝试。我发现当我使用Tk.quit()时窗口关闭,当我再次使用Tk()时,它会创建一个新窗口。

也许这不是正确的做法,但现在我会这样离开。 这将是一个更好的方法来删除和创建窗口,我将研究实现撤销和使用标签或框架显示和隐藏东西的可能性。