我想编写两个可堆叠的小部件,然后用密钥从一个小部件切换到另一个小部件。每个小部件都是Frame
,其中包含多个Label
个。到目前为止,我有以下代码(每Label
只有一个Frame
):
import Tkinter as tk
import ttk
import datetime
def main():
# initialize root
root = tk.Tk()
# initialize widgets
dash = Dashboard(root)
notepad = Notepad(root)
# set key actions
root.bind('<F11>', root.lift)
root.bind('<F1>', dash.raiseme)
root.bind('<F2>', notepad.raiseme)
root.mainloop()
class Dashboard(ttk.Frame):
def __init__(self, parent):
ttk.Frame.__init__(self, parent) # voodoo
self.dashframe = tk.Frame(parent)
self.labone = tk.Label(self.dashframe, text="lab1", fg='black', bg='blue')
self.labone.grid(row=0, column=0)
def raiseme(self, event):
print "raiseme dash"
self.labone.configure(text=datetime.datetime.now())
self.dashframe.lift()
class Notepad(ttk.Frame):
def __init__(self, parent):
ttk.Frame.__init__(self, parent) # also voodoo
self.noteframe = tk.Frame(parent)
self.laboneone = tk.Label(self.noteframe, text="lab11", fg='white', bg='red')
self.laboneone.grid(row=0, column=0)
def raiseme(self, event):
print "raiseme notepad"
self.laboneone.configure(text=datetime.datetime.now())
self.noteframe.lift()
if __name__ == '__main__':
main()
按F1
和F2
到达正确的例程但我唯一得到的是主窗口,为空。没有显示错误,所以我猜代码运行正常(只是不是O想要的方式:)。)
我可以使用上面的骨架实现切换吗?
答案 0 :(得分:2)
您的代码至少存在两个大问题。
首先,您要创建所有这些新帧,但不要将它们放在任何位置,因此它们永远不会出现在任何地方。如果你有一个没有放置任何东西的主窗口,当然你只需要“获取主窗口,空”。您需要在任何窗口小部件上调用pack
或其他布局方法,以使其显示在其父窗口上。在这种情况下,听起来你想将它们放在完全相同的位置,所以grid
或place
可能就是你想要的。
其次,您的Dashboard
和Notepad
类本身就是Frame
,但它们不会执行任何Frame
- ish的内容;相反,他们每个人都创建另一个兄弟姐妹Frame
并为该兄弟姐妹附上一个标签。因此,即使您打包Dashboard
和Notepad
,它们也只是空框架小部件,因此不会有任何好处。
如果您修复了这两个问题,我认为您的代码可以满足您的需求:
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
,而不是小部件。但至少它会调用grid
;你的甚至不这样做。