В вашем коде есть несколько ошибок, и это может быть потому, что вы, возможно, плохо знакомы с кодированием, 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, то есть вы создаете новый цикл для окна Toplevel.
Необходим только один цикл (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()