Python GUI代码单击按钮打开另一个窗口中断

时间:2013-11-24 20:24:33

标签: python python-2.7 tkinter

from Tkinter import *

class Window(Tk):
    def __init__(self, parent):
        Tk.__init__(self, parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.geometry("600x400+30+30")
        wButton = Button(self, text='text', command = self.OnButtonClick())
        wButton.pack()

    def OnButtonClick(self):
        top = Toplevel()
        top.title("title")
        top.geometry("300x150+30+30")
        topButton = Button(top, text="CLOSE", command = self.destroy)
        topButton.pack()


if __name__ == "__main__":
    window = Window(None)

    window.title("title")

    window.mainloop()

#        top.lift(aboveThis=self)
  #self.configure(state=DISABLED) - unknown option "-state"
  #ss = self.state()
  #self["state"] = "disabled" - unknown option "-state"
#ws = window.state()  # >>> ws outputs: 'normal'
  # varname.unbind("<Button-1>", OnButtonClick)
  #self.unbind("<Button-1>", OnButtonClick)
  #window.unbind("<Button-1>")
###if window.OnButtonClick == True:
###    window.unbind("<Button-1>", OnButtonClick)

上面的Python ver2.7.3代码,在IDLE ver2.7.3中运行时使用 Tkver8.5:首先显示较小的top = Toplevel()窗口 第二,在上面显示一个window = Window(Tk)的实例之前 它。这是在点击任何按钮或任何按钮之前。

上面代码中的所有注释都只是对我自己尝试过的事情以及接下来尝试的想法的注释(idk - 也许是无用的东西)。

如何将上面的代码更改为:将window = Window(Tk)的实例设为父窗口,将top = Toplevel()窗口设为子窗口。然后,当我运行程序时,只显示父窗口;然后当我点击'wButton'时,子窗口应显示在父窗口的顶部,父窗口被禁用 - 其按钮无法操作,用户无法通过单击将窗口提升到最前端? / p>

2 个答案:

答案 0 :(得分:5)

command只需要函数名称 - 没有()和参数。

使用

wButton = Button(self, text='text', command = self.OnButtonClick)

如果您使用command = self.OnButtonClick(),则运行self.OnButtonClick()并将结果分配给command。如果你想动态地为command创建函数,它会非常有用。


要在顶级父窗口中单独创建子窗口,您可以使用child.transient(parent)

在您的代码中,它应该是top.transient(self)

def OnButtonClick(self):
    top = Toplevel()
    top.title("title")
    top.geometry("300x150+30+30")

    top.transient(self)

    topButton = Button(top, text="CLOSE", command = self.destroy)
    topButton.pack()

您可以使用.config(state='disabled').config(state='normal')来停用/启用按钮。

您可以在OnButtonClick()中禁用主窗口按钮,但需要新功能才能在子窗口关闭之前/之后启用该按钮。

from Tkinter import *

class Window(Tk):
    def __init__(self, parent):
        Tk.__init__(self, parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.geometry("600x400+30+30")
        self.wButton = Button(self, text='text', command = self.OnButtonClick)
        self.wButton.pack()

    def OnButtonClick(self):
        self.top = Toplevel()
        self.top.title("title")
        self.top.geometry("300x150+30+30")
        self.top.transient(self)
        self.wButton.config(state='disabled')

        self.topButton = Button(self.top, text="CLOSE", command = self.OnChildClose)
        self.topButton.pack()

    def OnChildClose(self):
        self.wButton.config(state='normal')
        self.top.destroy()

if __name__ == "__main__":
    window = Window(None)

    window.title("title")

    window.mainloop()

答案 1 :(得分:0)

谢谢你,furas!

&#34;命令&#34;只需要一个函数名称 - 没有&#34;()&#34;和论点。     感谢您在那里捕捉我的错误。我认为这是什么&#34;神秘地&#34;改变了我之前得到的结果。我改变了&#34;命令&#34;选项,当我把它改回来时,我犯了错误,就是放入&#34;()&#34;。所以,我猜结果(已经绘制的顶部)是我得到的。关于为&#34;命令创建功能的见解&#34;动态看起来非常有用。我会记住这一点。

    你的四个建议很有效。哈,我记得试图弄清楚如何长时间改变窗口的状态,但是我找不到任何示例代码,所以即使在线查看*之后我也没有找到正确的语法。带有源代码的.py模块。我非常感谢向我展示解决方案。