Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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 can';不要将框架放在顶层_Python_Tkinter - Fatal编程技术网

Python can';不要将框架放在顶层

Python can';不要将框架放在顶层,python,tkinter,Python,Tkinter,我试图将一个框架和一组小部件放在一个顶层窗口中,我已经为它创建了菜单。当我运行这个程序时,我得到两个独立的窗口(参见屏幕抓图) 我想要的是在更大的“主”窗口中看到标签、输入框、按钮等 代码如下: # Basic menubar with a few sub-menus from tkinter import * from tkinter import ttk root = Tk() root.option_add("tearOff", FALSE) # ***************

我试图将一个框架和一组小部件放在一个顶层窗口中,我已经为它创建了菜单。当我运行这个程序时,我得到两个独立的窗口(参见屏幕抓图)

我想要的是在更大的“主”窗口中看到标签、输入框、按钮等

代码如下:

# Basic menubar with a few sub-menus

from tkinter import *
from tkinter import ttk


root = Tk()

root.option_add("tearOff", FALSE)

# ***************  SETUP THE CONTAINERS ***********
root.title("Menu Example")
root.geometry("600x300")

#frame = ttk.Frame(root, borderwidth = 5, relief = "sunken")

#frame.grid(row=0, column=0, sticky = (N,W,E,S))

# ***************************************************

# ****  Create the Menubar
win = Toplevel(root)
menubar = Menu(win)

appmenu = Menu(menubar, name='apple')


menubar.add_cascade(menu=appmenu)
appmenu.add_command(label='About My Application')
appmenu.add_separator()


win["menu"]=menubar

# Add some menus to the menubar
menu_file = Menu(menubar)
menu_edit = Menu(menubar)
menu_transform = Menu(menubar)

menubar.add_cascade(menu=menu_file, label="File") # cascade menu items add a menu to a menubar
menubar.add_cascade(menu=menu_edit, label="Edit")

# Add items to the menus
menu_file.add_command(label = "New") # command menu items add commands to a menu.
menu_file.add_command(label = "Open...")
menu_file.add_command(label = "Close")
menu_file.add_separator()
menu_file.add_command(label = "Export as ...")


menu_edit.add_command(label = "Copy")
menu_edit.add_command(label = "Paste")
menu_edit.add_cascade(menu=menu_transform, label="Transform")
menu_transform.add_command(label="group")
menu_transform.add_command(label="ungroup")
menu_transform.add_command(label="align")


#menu_edit.add_command(label = "Transform")




# *****************************************
frame = ttk.Frame(win, borderwidth = 5, relief = "sunken")
frame.grid(row=0, column=0, sticky = (N,W,E,S))

# ***************************************************

ipaddr = StringVar()
username = StringVar()
password = StringVar()

ipAddrLbl = ttk.Label(frame, text="Switch IP Address:")
ipAddrLbl.grid(column=0, row=1, sticky = W)

usernameLbl = ttk.Label(frame, text="User Name:")
usernameLbl.grid(column=0, row=2, sticky = W)

passwordLbl = ttk.Label(frame, text="Password:")
passwordLbl.grid(column=0, row=3, sticky = W)

ipaddrEntry = ttk.Entry(frame, textvariable="ipaddr")
ipaddrEntry.grid(column=1, row=1, sticky = W)

usernameEntry = ttk.Entry(frame, textvariable="username")
usernameEntry.grid(column=1, row=2, sticky = W)

passwordEntry = ttk.Entry(frame, textvariable="password", show = "*")
passwordEntry.grid(column=1, row=3, sticky = W)

loginButton = ttk.Button(frame, text = "Login")
loginButton.grid(column=0, row=4, sticky=W)



root.mainloop()

已更正使用顶级小部件而不是新Tk实例的代码:

import tkinter as tk
class Gui1:
    def __init__(self, root):
        self.root = root
        self.frame = tk.Frame(root)
        self.button =  tk.Button(text="Openwindow2",
        command=self.create_gui2)
        self.button.grid(row=0, column=0)
        self.frame.grid(row=1, column=1)

    def create_gui2(self):
        class Gui2:
            def __init__(self, root2):
                self.root2 = root2
                self.frame2 = tk.Frame(root2)
                self.label=tk.Label(text="Window 2")
                self.label.grid(row=0,column=0)
                self.frame2.grid(row=3,column=3)

        root2 = tk.Toplevel()
        app2 = Gui2(root2)


root = tk.Tk()
app = Gui1(root)
root.mainloop()

我认为这个问题的最佳答案是将根窗口图标化,然后您可以根据自己的内心内容修改顶层。这样,当mainloop没有双tkinter实例时,根主窗口被隐藏。下面是经过编辑的代码,稍加调整,以便在Toplevel关闭时主循环停止

# Basic menubar with a few sub-menus

from tkinter import *
from tkinter import ttk

def _delete_window():
    print ("delete_window")
    try:
        root.destroy()
    except:
        pass

root = Tk()

root.option_add("tearOff", FALSE)

# ***************  SETUP THE CONTAINERS ***********
root.title("Menu Example")
root.geometry("600x300")
root.iconify()
#frame = ttk.Frame(root, borderwidth = 5, relief = "sunken")

#frame.grid(row=0, column=0, sticky = (N,W,E,S))

# ***************************************************

# ****  Create the Menubar
win = Toplevel(root)
win.geometry('400x150')
menubar = Menu(win)

appmenu = Menu(menubar, name='apple')


menubar.add_cascade(menu=appmenu)
appmenu.add_command(label='About My Application')
appmenu.add_separator()


win["menu"]=menubar

# Add some menus to the menubar
menu_file = Menu(menubar)
menu_edit = Menu(menubar)
menu_transform = Menu(menubar)

menubar.add_cascade(menu=menu_file, label="File") # cascade menu items add a menu to 
a menubar
menubar.add_cascade(menu=menu_edit, label="Edit")

# Add items to the menus
menu_file.add_command(label = "New") # command menu items add commands to a menu.
menu_file.add_command(label = "Open...")
menu_file.add_command(label = "Close")
menu_file.add_separator()
menu_file.add_command(label = "Export as ...")


menu_edit.add_command(label = "Copy")
menu_edit.add_command(label = "Paste")
menu_edit.add_cascade(menu=menu_transform, label="Transform")
menu_transform.add_command(label="group")
menu_transform.add_command(label="ungroup")
menu_transform.add_command(label="align")


#menu_edit.add_command(label = "Transform")




# *****************************************
frame = Frame(win, borderwidth = 5, relief = "sunken")
frame.pack()
frame.place(relx=0.5, rely=0.5, anchor=CENTER)
# ***************************************************

ipaddr = StringVar()
username = StringVar()
password = StringVar()

ipAddrLbl = ttk.Label(frame, text="Switch IP Address:")
ipAddrLbl.grid(column=0, row=1, sticky = W)

usernameLbl = ttk.Label(frame, text="User Name:")
usernameLbl.grid(column=0, row=2, sticky = W)

passwordLbl = ttk.Label(frame, text="Password:")
passwordLbl.grid(column=0, row=3, sticky = W)

ipaddrEntry = ttk.Entry(frame, textvariable="ipaddr")
ipaddrEntry.grid(column=1, row=1, sticky = W)

usernameEntry = ttk.Entry(frame, textvariable="username")
usernameEntry.grid(column=1, row=2, sticky = W)

passwordEntry = ttk.Entry(frame, textvariable="password", show = "*")
passwordEntry.grid(column=1, row=3, sticky = W)

loginButton = ttk.Button(frame, text = "Login")
loginButton.grid(column=0, row=4, sticky=W)

win.protocol("WM_DELETE_WINDOW", _delete_window)
root.mainloop()

为什么不直接使用
root
小部件?您是否有多个顶层需要处理?您的问题不清楚。首先,您说您希望小部件位于顶层,然后您说您希望它们位于“主”窗口中。是哪一个?他们目前在顶层。那么第二个更大的窗口是什么?这是从哪里来的,我如何摆脱它?另一个较大的窗口是根窗口(即:根=Tk())的结果只是想添加一点,即如果需要在根/主窗口之外创建一个新窗口,则通常使用
顶级
。您不应该创建多个
Tk
实例。它是否嵌套并不重要。如果需要多个窗口,则第二个和后续窗口需要是
Toplevel
的实例。tkinter应用程序几乎总是应该有一个
Tk
的实例。那么我是否要用Toplevel替换第二个Tk实例呢?我看不出我的应用程序有什么不同。如果你有一个小的,有点简单的应用程序,你可能看不出有什么不同。不过,这确实有区别。每次创建
Tk
的新实例时,都会得到一个具有自己名称空间的新的嵌入式tcl解释器,这意味着小部件和变量(
StringVar
等)以及绑定不能从一个访问到另一个。