Вызовите функцию ClassB из ClassA, чтобы скрыть виджет ClassA - PullRequest
0 голосов
/ 03 мая 2019

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

Я пытаюсь разработать мульти-приложение.окно графического приложения для ввода данных в моей компании.Я использовал страницу для создания страниц.В настоящее время у меня есть 3 страницы, которые работают индивидуально, и множество функций для импорта и сохранения данных.Сейчас я пытаюсь создать функцию, которая скрывает все виджеты в корневом окне, чтобы я мог создать / показать новый Toplevel без видимых старых виджетов.

ClassB содержит все виджеты для моего корневого окна.Я пытаюсь вызвать ClassA.main_continue, который я хочу отобразить виджеты pageC и скрыть все виджеты root / classB.

Я получаю сообщение об ошибке «Максимальная глубина рекурсии превышена при вызове объекта Python».Python чередуется между попытками выполнить строки с метками "##### ... 1" и "##### .. 2" перед выходом с этой ошибкой.

Я потратил 10 часов на исследование ипробуя разные методы, чтобы открыть новое окно и скрыть старое окно.Со временем у меня будет 6-8 окон, поэтому я хочу отдельный класс, который я могу использовать для управления ими всеми.

import tkinter as tk

root = tk.Tk()
    top = ClassB (root)

class ClassA: #class that contains functions to control program/do tasks
    def main_continue(self, top):
        ClassC(root)
        x = ClassB(top) ################################## 1
        self.x.main_button1.place_forget()

class ClassB: #root window
    def __init__(self, top=None):
        y = ClassA()

        self.main_button1 = tk.Button(top, command= y.main_continue(top)) ######################2
        self.main_button1.pack()
        self.main_button1.place(relx=0.383, rely=0.5, height=24, width=140)
        self.main_button1.configure(text='''Continue''')

class ClassC: #2nd page
    def __init__(self, top=None):
        ## code for a different page of widgets

1 Ответ

0 голосов
/ 03 мая 2019

Сначала я хочу решить несколько ваших проблем в вашем коде. self.x.main_button1.place_forget() приведет к ошибке, поскольку self.x не существует. Сначала нужно определить x как атрибут класса, применив префикс self.. Далее вы используете pack() и place() на вашей кнопке. Вам не нужно делать это. Вам нужно только использовать один из 3 менеджеров геометрии. Мое личное предпочтение - grid(). Я считаю, что его проще всего использовать для моих макетов. На самом деле вы можете уменьшить свои 4 строки кода до 1 строки для этой кнопки.

Если вы собираетесь использовать классы для создания своего графического интерфейса, я бы порекомендовал наследовать от таких классов Tkinter, как Tk() instance и Frame или Toplevel.

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

import tkinter as tk


root = tk.Tk()
main_page = tk.Frame(root)
main_page.grid(row=0, column=0)
second_page = tk.Frame(root)


def show_main_page():
    second_page.grid_forget()
    main_page.grid(row=0, column=0)


def show_second_page():
    main_page.grid_forget()
    second_page.grid(row=0, column=0)

tk.Button(main_page, text='Show 2nd page', command=show_second_page).grid(row=0, column=0)
tk.Button(second_page, text='Show Main page', command=show_main_page).grid(row=0, column=0)

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