【问题标题】:The table shows in the main window instead of the toplevel window该表显示在主窗口而不是顶层窗口中
【发布时间】:2019-05-18 12:51:52
【问题描述】:

我试图让一个按钮在新窗口中显示一个表格,并向该窗口添加一个按钮以销毁自身。主要问题是表格显示在错误的窗口中。 感谢您的帮助。

我尝试自己做,但我尝试的所有方法都不起作用。


import tkinter as tk

class MainWindow(tk.Frame):
    counter = 0
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.button = tk.Button(self, text="Create new window", 
                                command=self.create_window)
        self.button.grid(padx = 5, pady = 5, row = 1, column = 3)

    def create_window(self):
        height = 2
        width = 3
        numberA=0
        achievs = ["1", "2", "3", "4", "5", "6"]

        self.counter += 1
        t = tk.Toplevel(self)
        t.wm_title("Window #%s" % self.counter)
        for i in range(height): #Rows
            for j in range(width): #Columns
                t = tk.Label(text=achievs[numberA], relief=tk.RIDGE)
                t.grid(row=i, column=j)
                numberA = numberA + 1
        t.mainloop

if __name__ == "__main__":
    root = tk.Tk()
    main = MainWindow(root)
    main.grid(row=4, column=5, padx=5, pady=25)
    root.mainloop()

如前所述,表格应该显示在顶层窗口中,如果可能的话,应该有一个按钮来销毁顶层窗口(我自己可能很难做到这部分)。

【问题讨论】:

  • 你使用的是什么版本的 Python 和 tkinter?
  • 你没有把它放在顶层。你认为 tkinter 应该如何知道小部件进入顶层?
  • 正如@BryanOakley 所说,您没有将它们放在顶层,我认为gridVal = tk.Label(ttext=achievs[numberA], relief=tk.RIDGE) t.grid(row=i, column=j) 应该可以解决它,如果我能理解您的问题,我会尝试提供完整的解决方案。

标签: python-3.x tkinter


【解决方案1】:

您的代码中有一些错误,这似乎是因为您可能是编码新手、tkinter 或两者兼而有之。

首先,您要创建一个 Toplevel() 窗口并将其分配给变量 t (t = tk.Toplevel(self)),然后在创建网格时,而不是将网格值放入您要分配的 Toplevel 窗口中保存Toplevel 窗口的变量的网格值

这不是 tkinter 的工作方式,要将元素添加到窗口中,您需要为该元素指定其主元素,在这种情况下,网格值的主元素是变量 t = tk.Toplevel()

这会将“create_window”函数更改为:

    def create_window(self):
        height = 2
        width = 3
        numberA=0
        achievs = ["1", "2", "3", "4", "5", "6"]

        self.counter += 1
        t = tk.Toplevel(self)
        t.wm_title("Window #%s" % self.counter)
        for i in range(height): #Rows
            for j in range(width): #Columns
                gridVal = tk.Label(t, text=achievs[numberA], relief=tk.RIDGE)
                gridVal.grid(row=i, column=j)
                numberA = numberA + 1

您犯的另一个错误是 tkinter 新用户的标准错误,即您正在为顶层窗口创建一个新循环。

只需要一个循环(root.mainloop()),创建第二个循环会导致问题,因此您可以删除创建第二个循环的调用(t.mainloop

改变这些东西会给你这样的代码,它应该可以按照你的意愿工作:

import tkinter as tk

class MainWindow(tk.Frame):
    counter = 0
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.button = tk.Button(self, text="Create new window",
                                command=self.create_window)
        self.button.grid(padx = 5, pady = 5, row = 1, column = 3)

    def create_window(self):
        height = 2
        width = 3
        numberA=0
        achievs = ["1", "2", "3", "4", "5", "6"]

        self.counter += 1
        t = tk.Toplevel(self)
        t.wm_title("Window #%s" % self.counter)
        for i in range(height): #Rows
            for j in range(width): #Columns
                gridVal = tk.Label(t, text=achievs[numberA], relief=tk.RIDGE)
                gridVal.grid(row=i, column=j)
                numberA = numberA + 1

if __name__ == "__main__":
    root = tk.Tk()
    main = MainWindow(root)
    main.grid(row=4, column=5, padx=5, pady=25)
    root.mainloop()

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多