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
等)以及绑定不能从一个访问到另一个。