2017-08-10 41 views
0

首先,我知道这不是一个问题,但真的需要帮助。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名称。它没有工作

如果任何意思有人需要看到整个代码,只是问。我不会首先发布,因为它太大了,我真的希望问题在这里。 由于事先

+0

在程序的生命周期中多次调用'Tk()'通常是一个坏主意,但我不认为它会导致* nothing *出现。你确定这个窗口不仅仅出现在现有的窗口后面吗?我已经看到这种情况经常发生。 – jasonharper

+0

没有,实在不行,我因子评分这是发生过,但问题是,代码运行goig过去线槽Tkinter的一部分,忽视,我想从窗口输入的代码运行 这导致了这样的事实乏没有价值观和我的代码崩溃的下部 –

+0

但我为什么souldnt使用TK()不止一次?我希望使用两个屏幕?它是否应该由插入的var名称分隔? –

回答

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)) 
+0

之前运行一些运行,实际上代码运行正常,即使你遇到了这个问题,但我已阅读关于lambda函数的一些事情,我已经纠正了一些事情。 即使在更新代码之后,代码仍然不起作用,直到我对窗口的创建和删除做了一些更改 –

0

我已经找到了解决办法,谢谢jasonharper为什么不使用TK()方法一遍又一遍地解释。

我正在使用Tk.destroy()并且实例被销毁,以及它得到的引用如此之多。这就是为什么代码无视我创建窗口的新尝试。我发现当我使用Tk.quit()时,窗口关闭,当我再次使用Tk()时,它创建一个新的窗口。

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