如何堆叠两个小部件并在它们之间切换?

时间:2013-12-09 23:11:24

标签: python tkinter

我想编写两个可堆叠的小部件,然后用密钥从一个小部件切换到另一个小部件。每个小部件都是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()

F1F2到达正确的例程但我唯一得到的是主窗口,为空。没有显示错误,所以我猜代码运行正常(只是不是O想要的方式:)。)

我可以使用上面的骨架实现切换吗?

1 个答案:

答案 0 :(得分:2)

您的代码至少存在两个大问题。

首先,您要创建所有这些新帧,但不要将它们放在任何位置,因此它们永远不会出现在任何地方。如果你有一个没有放置任何东西的主窗口,当然你只需要“获取主窗口,空”。您需要在任何窗口小部件上调用pack或其他布局方法,以使其显示在其父窗口上。在这种情况下,听起来你想将它们放在完全相同的位置,所以gridplace可能就是你想要的。

其次,您的DashboardNotepad类本身就是Frame,但它们不会执行任何Frame - ish的内容;相反,他们每个人都创建另一个兄弟姐妹Frame并为该兄弟姐妹附上一个标签。因此,即使您打包DashboardNotepad,它们也只是空框架小部件,因此不会有任何好处。

如果您修复了这两个问题,我认为您的代码可以满足您的需求:

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;你的甚至不这样做。