Использование Frame.quit в Python - PullRequest
0 голосов
/ 26 августа 2018

В настоящее время я использую Python 3 и пишу свою первую программу с графическим интерфейсом.Я не хочу импортировать tkinter как: from tkinter import *, а хочу импортировать его как import Tkinter из-за моего понимания работы модулей.

В следующем коде моя кнопка выхода не отображаетсят работа.Почему нет?

import tkinter


class Main_Frame:

    def __init__(self, welk_window):
        top_Frame = tkinter.Frame(welk_window, width = "1", height = "1") 
        top_Frame.pack()

        self.Button_start = tkinter.Button(top_Frame, text = "Start", fg ="green", command=self.startMessage)
        self.Button_start.pack(side=tkinter.LEFT)

        self.Button_quit = tkinter.Button(top_Frame, text = "Quit", fg ="red", command=Frame.quit)
        self.Button_quit.pack(side=tkinter.LEFT)

    def startMessage(self):
        print("Start")


root = tkinter.Tk()     
master_window = Main_Frame(root) 
root.mainloop()

Что я делаю не так?Я знаю, что это как-то связано с вызовом атрибута Frame.quit.Я попытался использовать Tkinter.Frame.quit, но это тоже не сработало.Заранее спасибо!

1 Ответ

0 голосов
/ 26 августа 2018

Вы правы, что вам нужно назвать класс tkinter.Frame вместо просто Frame.

И вы также правы, что ничего не решите.

Потому чтокорень проблемы в том, что вам нужно вызывать метод на Frame экземпляре , а не на Frame классе .

К счастью, у вас есть готовыйссылка на соответствующий Frame экземпляр, лежащий вокруг, из этой строки:

    top_Frame = tkinter.Frame(welk_window, width = "1", height = "1") 

Итак, вы можете просто использовать его:

    self.Button_quit = tkinter.Button(top_Frame, text = "Quit", fg ="red", 
                                      command=top_Frame.quit)

Однако, стоит подуматьнемного редизайна.

Обычно, когда вы создаете классы для tkinter, вы хотите, чтобы ваши объекты были либо непосредственно виджетом, либо контроллером для виджета.Ваш Main_Frame объект просто создает виджет кадра во время инициализации, а затем забывает его, так что на самом деле это не так.


Чтобы сделать Main_Frame рамкой, просто наследуйте от Frame и используйте self везде, где вы бы использовали top_Frame:

class Main_Frame(tkinter.Frame):

    def __init__(self, welk_window):
        super().__init__(welk_window, width = "1", height = "1") 
        self.pack()

        self.Button_start = tkinter.Button(self, text = "Start", fg ="green", command=self.startMessage)
        self.Button_start.pack(side=tkinter.LEFT)

        self.Button_quit = tkinter.Button(self, text = "Quit", fg ="red", command=self.quit)
        self.Button_quit.pack(side=tkinter.LEFT)

    def startMessage(self):
        print("Start")

Чтобы сделать его контроллером кадров, просто сохраните top_Frame в качестве атрибута, так же, как вы делаете с Button_start:

class Main_Frame:

    def __init__(self, welk_window):
        self.top_Frame = tkinter.Frame(welk_window, width = "1", height = "1") 
        self.top_Frame.pack()

        self.Button_start = tkinter.Button(top_Frame, text = "Start", fg ="green", command=self.startMessage)
        self.Button_start.pack(side=tkinter.LEFT)

        self.Button_quit = tkinter.Button(top_Frame, text = "Quit", fg ="red", command=self.top_Frame.quit)
        self.Button_quit.pack(side=tkinter.LEFT)

    def startMessage(self):
        print("Start")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...