Приложение tkinter вращается 2 windows, используя MVC - PullRequest
1 голос
/ 24 марта 2020

Я работаю над простым приложением, пытающимся использовать шаблон MVC. Проблема, которую я обнаружил (которую я предсказываю, является действительно глупой, но я потерял свою резиновую утку) состоит в том, что два приложения tkinter созданы, где я ожидаю только одно. Более того, второй экземпляр создан, но не виден, что изначально меня разозлило, поскольку я не знал, что он существует; -)

Пахнет для меня, как будто создается другой экземпляр Tk (), но не когда, где и почему.

enter image description here

Когда я заменяю root = Main() на root = tk.Tk() в AppDelegte, все работает как шарм, и создается только одно окно приложения, как предназначен.

Приложение создано по следующему коду:

Делегат приложения

from controller.main import Main

root = Main()

root.mainloop()

Главный контроллер

import tkinter as tk
from tkinter import ttk

from view.actual_readings import ActualReadings


class Main(tk.Tk):

    actual_readings = ActualReadings(None)

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

        main_frame = ttk.Frame(self, padding="25")
        main_frame.grid(column=0, row=0)

        self.actual_readings.master = main_frame
        self.actual_readings.grid(column=0, row=0)

Просмотр показаний

from tkinter import *
from tkinter import ttk


class ActualReadings(ttk.Frame):

    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)

        header = ttk.Label(self, text="header text", font="TkFixedFont", padding="75 25 75 10")
        current_value_lbl = ttk.Label(self, text="current value",
                                         font="TkFixedFont")
        current_value_val = ttk.Label(self, text="here comes reading", font="TkFixedFont")

        header.grid(column=0, row=0, columnspan=2)
        current_value_lbl.grid(column=0, row=1, sticky=E)
        current_value_val.grid(column=1, row=1, sticky=W)

1 Ответ

2 голосов
/ 24 марта 2020

Это потому, что когда вы создаете Main (экземпляр Tk()), сначала создается его член класса actual_readings. Так как его родителем является None, что вызывает создание экземпляра Tk () по умолчанию. Таким образом, будет два Tk() экземпляра.

Чтобы решить проблему, вы должны создать actual_readings внутри __init__() функцию:

class Main(tk.Tk):
    actual_readings = None

    def __init__(self):
        super().__init__()
        main_frame = ttk.Frame(self, padding='25')
        main_frame.grid(row=0, column=0)
        if self.actual_readings is None:
            self.actual_readings = ActualReadings(main_frame)
            self.actual_readings.grid(row=0, column=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...