Python 如何堆叠两个小部件并在它们之间切换?
我想编写两个小部件的脚本,这两个小部件将被堆叠起来,我将使用一个键从一个小部件切换到另一个小部件。每个小部件都是一个Python 如何堆叠两个小部件并在它们之间切换?,python,tkinter,Python,Tkinter,我想编写两个小部件的脚本,这两个小部件将被堆叠起来,我将使用一个键从一个小部件切换到另一个小部件。每个小部件都是一个框架,包含几个标签s。到目前为止,我有以下代码(每个框架只有一个标签): 将Tkinter作为tk导入 导入ttk 导入日期时间 def main(): #初始化根 root=tk.tk() #初始化小部件 仪表板(根) 记事本=记事本(根) #设置关键操作 根部绑定(“”,根部提升) root.bind(“”,破折号.raiseme) root.bind(“”,notepad.r
框架
,包含几个标签
s。到目前为止,我有以下代码(每个框架只有一个标签
):
将Tkinter作为tk导入
导入ttk
导入日期时间
def main():
#初始化根
root=tk.tk()
#初始化小部件
仪表板(根)
记事本=记事本(根)
#设置关键操作
根部绑定(“”,根部提升)
root.bind(“”,破折号.raiseme)
root.bind(“”,notepad.raiseme)
root.mainloop()
类仪表板(ttk.Frame):
定义初始化(自身,父级):
ttk.Frame.uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.dashframe=tk.Frame(父级)
self.labone=tk.Label(self.dashframe,text=“lab1”,fg='black',bg='blue')
self.labone.grid(行=0,列=0)
def raiseme(自身、事件):
打印“raiseme dash”
self.labone.configure(text=datetime.datetime.now())
self.dashframe.lift()
类记事本(ttk.Frame):
定义初始化(自身,父级):
ttk.Frame.uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.noteframe=tk.Frame(父级)
self.laboneone=tk.Label(self.noteframe,text=“lab11”,fg='白色',bg='红色')
self.labonene.grid(行=0,列=0)
def raiseme(自身、事件):
打印“raiseme记事本”
self.laboneone.configure(text=datetime.datetime.now())
self.noteframe.lift()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
按F1
和F2进入正确的例程,但我得到的唯一结果是主窗口为空。没有显示错误,所以我猜代码运行良好(只是不是O希望的方式:))
我可以使用上面的框架实现切换吗?您的代码至少有两个大问题 首先,您正在创建所有这些新帧,但不会将它们放置在任何位置,因此它们永远不会出现在任何位置。如果你有一个没有放置任何东西的主窗口,当然你只需要“获取主窗口,清空”。您需要在任何小部件上调用
pack
或其他一些布局方法,以使其显示在其父部件上。在本例中,听起来您希望将它们放在完全相同的位置,因此grid
或place
可能就是您想要的
其次,你的仪表板
和记事本
类本身就是框架
类,但它们不做任何框架
类的事情;相反,它们各自创建另一个同级Frame
,并将标签附加到该同级。因此,即使您打包了仪表板
和记事本
,它们也只是空框小部件,所以这没有任何好处
如果您同时修复了这两个问题,我认为您的代码可以满足您的要求:
class Dashboard(ttk.Frame):
def __init__(self, parent):
ttk.Frame.__init__(self, parent) # voodoo
self.labone = tk.Label(self, text="lab1", fg='black', bg='blue')
self.labone.grid(row=0, column=0)
self.grid(row=0, column=0)
def raiseme(self, event):
print "raiseme dash"
self.labone.configure(text=datetime.datetime.now())
self.lift()
class Notepad(ttk.Frame):
def __init__(self, parent):
ttk.Frame.__init__(self, parent) # also voodoo
self.laboneone = tk.Label(self, text="lab11", fg='white', bg='red')
self.laboneone.grid(row=0, column=0)
self.grid(row=0, column=0)
def raiseme(self, event):
print "raiseme notepad"
self.laboneone.configure(text=datetime.datetime.now())
self.lift()
但是,您可能还希望为所有内容设置一个固定的大小;否则,您可能会提升红色小部件,例如,只覆盖蓝色小部件的96%,因为当前时间比前一个小部件稍微窄一些
您为灵感而链接的代码尝试执行以下操作:
newFrame = tkinter.Frame(root).grid()
newFrame_name = tkinter.Label(newFrame, text="This is another frame").grid()
这不起作用,因为
grid
返回None
,而不是小部件。但至少它调用了网格;你的甚至没有这样做。看起来这里可能有一些有用的信息:[[1]:@Totem:是的,我看到了这个问题(并从那里了解了lift
)但是它没有帮助。您没有使用pack
或grid
或其他任何东西将任何帧放置在任何位置,因此…您希望它们出现在哪里?好的,我唯一能想到的另一件事可能会有帮助的是使用focus\u set查看可能性。另外,为什么您的每个帧子类都在同一帧上创建第二个帧父帧(也没有放在任何地方),然后将标签添加到第二个帧中,而不是添加到它本身?谢谢。我发现我提升了错误的元素,这是一件事(子帧之外的元素没有意义,现在我开始理解它们是如何工作的)。您提到我没有使用grid()
--我使用了它们,但只在标签上使用了元素。现在我明白了,我还需要在框架上使用网格()
,这确实是有意义的。至于固定大小-你是对的,我给出的代码只是一个小例子。再次感谢!作为一个附带问题:你知道ttk.frame.是什么吗
行可以吗?(我在一个示例中发现了这一点,但这一行的含义让我不知所措)@WoJ:尝试解释它。如果仍然不清楚,请随时提出后续问题。(顺便说一句,这是升级到Python 3.x后变得更简单的许多事情之一。)
newFrame = tkinter.Frame(root).grid()
newFrame_name = tkinter.Label(newFrame, text="This is another frame").grid()