tkinter отобразить новый кадр из меню - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь написать свой первый скрипт на python & tkinter.

Я блокирую отображение нового кадра из функции ( def onDisplay ), когда щелчок сделан из кнопки строки меню, но ничего не добавляется. Ошибка не отображается: - (

Новый фрейм сделан с динамическими флажками из текстовых файлов: текстовый файл:

item1
item2
...
item100

Экран графического интерфейса:

enter image description here

Вот мой код:

from tkinter import Tk, Frame, Menu, Checkbutton, Text, TOP, BOTH, X, N, LEFT, BooleanVar
from tkinter.ttk import Frame, Label, Entry
import glob

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()
        #self.display_srv()

    def initUI(self):

        self.master.title("Submenu")

        menubar = Menu(self.master)
        self.master.config(menu=menubar)

        fileMenu = Menu(menubar)

        submenu = Menu(fileMenu)
        submenu.add_command(label="lst1", command=self.onDisplay)
        submenu.add_command(label="lst2")
        submenu.add_command(label="lst3")
        fileMenu.add_cascade(label='Listing', menu=submenu, underline=0)

        fileMenu.add_separator()

        fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
        menubar.add_cascade(label="File", underline=0, menu=fileMenu)

    #The frame i tried to display
    def onDisplay(self):
        self.master.title("display it")
        self.pack(fill=BOTH, expand=True)
        frame1 = Frame(self)
        frame1.pack(fill=X)
        path = '/root/liste/*.txt'
        files=glob.glob(path)
        count = 0
        for file in files:
            with open(file, 'r') as lst_file:
                for item in lst_file:
                    # Need to split all item by 10
                    Checkbutton(self, text=item.rstrip()).grid(row=count//10, column=count%10)
                    count += 1


    def onClick(self):
        if self.var.get() == True:
            self.master.title("Checkbutton")
        else:
            self.master.title("")

    def onExit(self):

        self.quit()


def main():

    root = Tk()
    root.geometry("850x550+300+300")
    app = Example()
    root.mainloop()


if __name__ == '__main__':

Большое спасибо за любую помощь

С уважением,

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я отправил правильный код:

from tkinter import Tk, Frame, Menu, Checkbutton, Text, TOP, BOTH, X, N, LEFT, BooleanVar
from tkinter.ttk import Frame, Label, Entry
import glob

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()
        #self.display_srv()

    def initUI(self):

        self.master.title("Submenu")

        menubar = Menu(self.master)
        self.master.config(menu=menubar)

        fileMenu = Menu(menubar)

        submenu = Menu(fileMenu)
        submenu.add_command(label="lst1", command=self.onDisplay)
        submenu.add_command(label="lst2")
        submenu.add_command(label="lst3")
        fileMenu.add_cascade(label='Listing', menu=submenu, underline=0)

        fileMenu.add_separator()

        fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
        menubar.add_cascade(label="File", underline=0, menu=fileMenu)
    def onDisplay(self):
        self.master.title("display it")
        self.pack(fill=BOTH, expand=True)
        frame1 = Frame(self)
        frame1.pack(fill=X)
        path = '/root/liste/*.txt'
        files=glob.glob(path)
        count = 0
        for file in files:
            with open(file, 'r') as lst_file:
                for item in lst_file:
                    cb = Checkbutton(frame1, text=item.rstrip())
                    cb.grid(row=count//10, column=count%10)
                    count += 1

    def onClick(self):
        if self.var.get() == True:
            self.master.title("Checkbutton")
        else:
            self.master.title("")

    def onExit(self):

        self.quit()

def main():

    root = Tk()
    root.geometry("850x550+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()
0 голосов
/ 15 ноября 2018

Основная проблема заключается в том, что вы смешиваете grid и pack в одном родительском контейнере. Вы звоните pack на frame1, но вы звоните grid на кнопках, и у них обоих есть мастер или родительский элемент self.

Это не может работать, потому что каждый из grid и pack будет пытаться изменить размер контейнера в соответствии с его правилами, заставляя другой переконфигурировать в соответствии с его правилами, и так далее до конца времени.

Таким образом, просто изменив свой вызов с .grid(...) на .pack(...) на кнопках, вы решите эту проблему.

Полагаю, вы намеревались поместить кнопки внутри frame1. Если это так, вам нужно указать frame1 в качестве мастера для кнопок. Для удобства чтения и простоты отладки я также рекомендую размещать вызов grid на отдельной строке. При этом вы можете продолжать использовать grid для кнопок проверки и pack для всего остального.

cb = Checkbutton(frame1, text=item.rstrip())
cb.grid(row=count//10, column=count%10)
...