Не удается получить Tkinter GUI для отображения с использованием классов - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь создать Tkinter GUI, который принимает документы Excel, читает их и экспортирует в окно. Проблема в том, что когда я изменил код на приведенный ниже, чтобы включить структуру классов, я больше не могу правильно загружать GUI.

import tkinter as tk
from tkinter.filedialog import askopenfilename

def NewFile():
    print("New File!")
def OpenFile():
    name = askopenfilename()
    print(name)
def About():
    print("About works")
def deletelist():
    listbox.delete(0, END)

class MainApplication(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master = master
        self.frame = tk.Frame(self.master)

        self.load = tk.Button(self.frame, text = "Load XLSX File", command = OpenFile)
        self.load.grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'w')

        self.ckframe = tk.LabelFrame(self.frame, text="Currency Selections")
        self.ckframe.grid(row = 1, column = 0, padx = 5, pady = 5, stick = 'nesw')
        self.prochk = tk.Checkbutton(self.ckframe, text = '1 Currency').grid(row = 1, column = 0, columnspan = 2, sticky = 'w')
        self.msnchk = tk.Checkbutton(self.ckframe, text = '2 Currency').grid(row = 1, column = 2, columnspan = 2, sticky = 'w')
        self.nightschk = tk.Checkbutton(self.ckframe, text = '3 Currency').grid(row = 1, column = 4, columnspan = 2, sticky = 'w')
        self.semichk = tk.Checkbutton(self.ckframe, text = '4 Currency').grid(row = 2, column = 0, columnspan = 2, sticky = 'w')
        self.instqualCRchk = tk.Checkbutton(self.ckframe, text = '5 Currency').grid(row = 2, column = 2, columnspan = 2, sticky = 'w')
        self.msnCRchk = tk.Checkbutton(self.ckframe, text = '6 Currency').grid(row = 2, column = 4, columnspan = 2, sticky = 'w')

        self.listbox = tk.Listbox(self.frame, width = 83)
        self.listbox.grid(row = 3, column = 0, columnspan = 1, sticky = 'w') # Fix width size function
        self.listbox.insert(1, 'Test1')
        self.listbox.insert(0, 'Test2')
        self.save = tk.Button(self.frame, text = "Save").grid(row = 8, column = 0, padx = 5, pady = 5, stick = 'e')
        self.delete = tk.Button(self.frame, text = "Delete", command = deletelist).grid(row = 8, column = 0, padx = 45, pady = 5, stick = 'e')

if __name__ == '__main__':
    root = tk.Tk()
    MainApplication(root)
    root.mainloop()

Я много искал, пытаясь найти решение для использования классов с tkinter GUI и сеточной системой, но в основном я находил способы создавать графические интерфейсы с решением pack ().

1 Ответ

0 голосов
/ 29 мая 2020

Экземпляр MainApplication - это фрейм. Вы никогда не вызываете pack или place или grid в этом экземпляре, чтобы этот фрейм и все его дочерние элементы были невидимы.

Этот фрейм создает другой фрейм, содержащий все другие виджеты, self.frame. Вы также никогда не вызываете для него pack, place или grid, поэтому он и все его дочерние элементы будут невидимы.

Поскольку виджеты находятся в невидимом фрейме, и этот фрейм сам невидим, другие виджеты не будут видны.

Первое, что нужно сделать, это избавиться от self.frame. Удалите строку, которая его создает, и везде, где вы ссылаетесь на self.frame, замените ее на self. Поскольку self в этом контексте уже является фреймом, нет смысла создавать внутри другой фрейм.

Затем вам нужно добавить экземпляр MainApplication в окно. Поскольку это единственный виджет непосредственно в окне root, pack - самый простой выбор.

root = tk.Tk()
app = = MainApplication(root)
app.pack(fill="both", expand=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...