Глобальная переменная TKInter для кнопки - PullRequest
0 голосов
/ 10 января 2019

Я использую многокадровое окно из Стивен М. Васселларо пример Переключение между двумя кадрами в tkinter . И я не понимаю, возможно ли использовать глобальную переменную, потому что каждый кадр разрушается каждый раз, когда он изменяется. 1-я (из 2-х кнопок) кнопка на StartPage деактивируется, если я нажимаю на 2-ю кнопку и перехожу на PageOne, что-то там делаю и возвращаюсь на StartPage 1-я кнопка должна быть активирована.

Если я объявлю global в StartPage классе

_tkinter.TclError: invalid command name ".!startpage.!button2"

Если я объявлю это в PageOne классе

NameError: name 'install_svc' is not defined

Не очень хорошая идея, но я думаю о 3-м кадре, где я снова определяю кнопки.

РЕДАКТИРОВАТЬ1:

class MyGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self._frame = None
        self.switch_frame(StartPage)
        self.geometry("400x300")

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

    def quit_app(self):
        self._frame.destroy()
        self.destroy()

class StartPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        global install_svc

class PageOne(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
    def entry_check(self,parent):
        global install_svc

1 Ответ

0 голосов
/ 10 января 2019

Объявите и инициализируйте install_svc на корневом уровне (глобальная область). Оператор global install_svc сам по себе не будет автоматически создавать переменную в глобальной области видимости: он просто выполнит поиск глобальной переменной с таким именем, но, если вы попытаетесь использовать эту переменную без предварительного присвоения ей чего-либо, NameError будет брошено.

код

install_svc = None # Or some other initial value

class MyGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self._frame = None
        self.switch_frame(StartPage)
        self.geometry("400x300")

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

    def quit_app(self):
        self._frame.destroy()
        self.destroy()

class StartPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        global install_svc

        # You can use install_svc safely
        print(install_svc)

class PageOne(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
    def entry_check(self,parent):
        global install_svc

        # You can use install_svc safely
        print(install_svc)

Вы также можете проверить, существует ли переменная, сделав try..except, но это будет действительно ужасно (по крайней мере, для меня), и вам нужно будет делать такую ​​проверку везде:

class MyGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self._frame = None
        self.switch_frame(StartPage)
        self.geometry("400x300")

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

    def quit_app(self):
        self._frame.destroy()
        self.destroy()

class StartPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        global install_svc

        try:
            install_svc
        except NameError:
            install_svc = None # Or some initial value

class PageOne(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
    def entry_check(self,parent):
        global install_svc

        try:
            install_svc
        except NameError:
            install_svc = None # Or some initial value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...