Таблица отображается в главном окне вместо окна верхнего уровня - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь позволить кнопке показать таблицу в новом окне и добавить кнопку в это окно, чтобы уничтожить себя. Основная проблема заключается в том, что таблица отображается в неправильном окне. Спасибо за помощь.

Я пытался сделать это сам, но все, что я пытался, не работает.


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()

Как уже говорилось, таблица должна отображаться в окне верхнего уровня, и, если возможно, должна быть кнопка для разрушения окна верхнего уровня (я, вероятно, могу выполнить эту часть самостоятельно).

1 Ответ

0 голосов
/ 18 мая 2019

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