Проблемы с отключением Меню в Ткинтере - PullRequest
0 голосов
/ 18 октября 2019

У меня проблема с отключением меню в моем приложении Tkinter. Только я хочу показать их только на определенных страницах, я пытался отключить их в функции init моего приложения, но это не сработало, я пытался отключить их в функции show frames моего приложения, но это не помогло. t, и я попытался отключить их через класс стартовой страницы моего приложения, поскольку я попытался использовать self.menubar, parent.menubar и controler.menubar;Но, похоже, ничего не работает. Я просто кодировал бы их на каждой отдельной странице, но это единственный способ, который я нашел, чтобы показать их на любой странице. Любая помощь приветствуется.

class App(tk.Tk):

    def __init__(self,*args,**kwargs):
        tk.Tk.__init__(self,*args,**kwargs)

        container = tk.Frame(self)
        container.pack(side='top',fill='both',expand= True)
        container.grid_rowconfigure(0,weight = 1)
        container.grid_columnconfigure(0,weight = 1)

        menubar = tk.Menu(container)
        file = tk.Menu(menubar, tearoff = 0)
        file.add_command(label='Exit', command = quit)
        menubar.add_cascade(label='File',menu=file)
        tk.Tk.config(self, menu=menubar)

        self.frames = {}

        for F in (StartPage):
            frame = F(container,self)
            self.frames[F] = frame
            frame.grid(row=0,column=0,sticky='nsew')
            page = F
        self.show_frame(StartPage)

    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        menubar.add_cascade(label='File',state=DISABLED)
        label = ttk.Label(self, text='Start', font = LARGE_FONT).pack()

main = App()
main.mainloop()

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

1-й позволяет очистить это, чтобы более точно отразить стандарт PEP8 для удобства чтения.

Добавлен в импорт, как это должно было быть в вашем примере.

Нам нужно заменить скобкив (StartPage) с такими скобками [StartPage]. Это связано с тем, что одно значение в скобках обрабатывается как одно значение без скобок, поэтому вы пытаетесь перебрать объект, а не список. Вместо того, чтобы вызывать tk.tk.config() do self.config(menu=self.menubar).

для вашего StartPage класса, вы не сможете ничего сделать с меню по нескольким причинам. Во-первых, вы не определяете строку меню как атрибут класса в вашем основном классе tk. Во-вторых, вы неправильно вызываете свой мастер и контейнер, поэтому я изменил имена аргументов в init , чтобы лучше отражать то, с чем мы работаем, чтобы вы могли видеть, что вам нужно вызывать.

Напоследок суть, если проблему с отключением меню нужно использовать entryconfig()

См. Ниже приведенный код:

import tkinter as tk
import tkinter.ttk as ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.menubar = tk.Menu(container)
        self.config(menu=self.menubar)
        file = tk.Menu(self.menubar, tearoff=0)
        file.add_command(label='Exit', command=quit)
        self.menubar.add_cascade(label='File', menu=file)

        self.frames = {}
        for F in [StartPage]:
            frame = F(self, container)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew')
            page = F
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):
    def __init__(self, master, container):
        tk.Frame.__init__(self, container)
        master.menubar.entryconfig('File', state='disabled')
        ttk.Label(self, text='Start').pack()


main = App()
main.mainloop()
0 голосов
/ 21 октября 2019

Это не проблема tkinter, это то, как работает python - для изменения объекта вам нужна ссылка на объект. Это верно для виджетов tkinter так же, как и для словарей, строк или любых других объектов в python.

В этом случае объект является частью основного приложения. Сначала вам нужно сохранить ссылку на него:

class App(tk.Tk):

    def __init__(self,*args,**kwargs):
        ...
        self.menubar = tk.Menu(container)
        ...

В более позднем коде вы теперь можете получить доступ к этому меню из переменной controller, которая является ссылкой на экземпляр App:

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        controller.menubar.entryconfigure('File',state="disabled")

Однако, скорее всего, это не будет делать то, что вы хотите, так как этот код запускается при запуске программы. Я предполагаю, что вы хотите, чтобы код запускался при выборе страницы. Для этого следуйте инструкциям в этом ответе на вопрос Как создать метод, который запускается каждый раз, когда в tkinter

отображается кадр
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...