Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter顶层_Python_Tkinter_Window - Fatal编程技术网

Python Tkinter顶层

Python Tkinter顶层,python,tkinter,window,Python,Tkinter,Window,我正在开发一个需要多个窗口的程序,第一个出现的是登录窗口,我使用Toplevel小部件使其他窗口成为其子窗口,但此代码始终显示两个窗口,而不是一个窗口 from Tkinter import Frame, Toplevel from ttk import Label, Entry, Button class loginWindow(Toplevel): def __init__(self): Toplevel.__init__(self) self.t

我正在开发一个需要多个窗口的程序,第一个出现的是登录窗口,我使用Toplevel小部件使其他窗口成为其子窗口,但此代码始终显示两个窗口,而不是一个窗口

from Tkinter import Frame, Toplevel
from ttk import Label, Entry, Button


class loginWindow(Toplevel):
    def __init__(self):
        Toplevel.__init__(self)
        self.title("Title")
        self.frame = Frame(self)
        self.frame.pack()
        self.__make_layout()
        self.mainloop()

    def __make_layout(self):
        self.frame.user_name_label = Label(text="User name:")
        self.frame.user_name_text = Entry()
        self.frame.user_name_label.grid(row=0, column=0)
        self.frame.user_name_text.grid(row=0, column=1)
        self.frame.password_label = Label(text="Password:")
        self.frame.password_text = Entry()
        self.frame.password_label.grid(row=1, column=0)
        self.frame.password_text.grid(row=1, column=1)
        self.frame.login_button = Button(text="Login")# , command=self.__create_window)
        self.frame.login_button.grid(row=2, column=0, columnspan=2)


if __name__ == '__main__':
    win1 = loginWindow()

\u make\u layout
中创建的所有小部件都是在没有父级的情况下创建的。这意味着它们是默认根的子级。您需要将父对象传递给它们中的每一个,就像传递给
帧一样。像这样:

self.frame.user_name_label = Label(self.frame, text="User name:")
self.frame.user_name_text = Entry(self.frame)
# etc.

当我运行您的精确代码时,在我尝试的任何平台上都没有第二个窗口。我得到的最接近的是OSX,其中默认根窗口的条目出现在窗口菜单中,但窗口本身仍然没有出现,并且小部件最终都位于
顶层
(尽管不是在您想要的
框架
上)。但是Tkinter在这里显示第二个窗口,并将部分或全部小部件放在上面肯定是合法的。

\u make\u layou
中创建的所有小部件都是在没有父窗口的情况下创建的。这意味着它们是默认根的子级。您需要将父对象传递给它们中的每一个,就像传递给
帧一样。像这样:

self.frame.user_name_label = Label(self.frame, text="User name:")
self.frame.user_name_text = Entry(self.frame)
# etc.

当我运行您的精确代码时,在我尝试的任何平台上都没有第二个窗口。我得到的最接近的是OSX,其中默认根窗口的条目出现在窗口菜单中,但窗口本身仍然没有出现,并且小部件最终都位于
顶层
(尽管不是在您想要的
框架
上)。但是Tkinter在这里显示第二个窗口,并将部分或全部小部件放在上面当然是合法的。

这一定是一个平台相关的问题,因为abarnert没有多个窗口的问题。我将OS X与XQuartz一起使用,以下代码为我提供了两个窗口:

from Tkinter import Toplevel, Tk
Toplevel().mainloop()
但是,此代码为我提供了一个窗口:

from Tkinter import Toplevel, Tk
Tk().mainloop()

我认为您的第一个窗口应该声明为
Tk()
,后续窗口应该声明为
Toplevel()

这一定是一个平台相关的问题,因为abarnert没有多个窗口的问题。我将OS X与XQuartz一起使用,以下代码为我提供了两个窗口:

from Tkinter import Toplevel, Tk
Toplevel().mainloop()
但是,此代码为我提供了一个窗口:

from Tkinter import Toplevel, Tk
Tk().mainloop()

我认为您的第一个窗口应该声明为
Tk()
,后续窗口应该声明为
Toplevel()

您如何让Tkinter为X11而不是Aqua编译?这在多个版本之前就不再适用了…我正在使用Anaconda 2.7。疯狂…无论如何,我能够在Windows上用cygwin Python和X11复制这一点。所以我想问题是,无论Tkinter如何隐藏未使用的主窗口,都可以在Aqua和Windows上运行,至少在一个现代GNOME X11系统上运行……但不能在所有X11系统上运行,特别是包括XQuartz或Cygwin这样的时髦系统,它们将一些窗口管理委托给本机窗口管理器?@abarnet,像MacPorts这样的一些分销商已经支持在OSX上构建X11有相当长的一段时间了。并且,从2.7.6/3.3.3/3.4.0开始,现在有了标准的Python
/configure
make
选项,允许覆盖默认的Tcl和Tk头和库位置;看,你是如何让Tkinter为X11而不是Aqua编译的?这在多个版本之前就不再适用了…我正在使用Anaconda 2.7。疯狂…无论如何,我能够在Windows上用cygwin Python和X11复制这一点。所以我想问题是,无论Tkinter如何隐藏未使用的主窗口,都可以在Aqua和Windows上运行,至少在一个现代GNOME X11系统上运行……但不能在所有X11系统上运行,特别是包括XQuartz或Cygwin这样的时髦系统,它们将一些窗口管理委托给本机窗口管理器?@abarnet,像MacPorts这样的一些分销商已经支持在OSX上构建X11有相当长的一段时间了。并且,从2.7.6/3.3.3/3.4.0开始,现在有了标准的Python
/configure
make
选项,允许覆盖默认的Tcl和Tk头和库位置;看见