Сброс окна Tkinter, восстановление виджетов - PullRequest
0 голосов
/ 14 апреля 2019

Я надеюсь создать кнопку для полного сброса окна Tkinter, как если бы программа была запущена с нуля. Вот мой нынешний способ сделать это. Однако это не работает, как надеялись.

from tkinter import *

master = Tk()

    def do_something_():
         #*performing a function on widget*

    DoThing = Button(master, text='Do Something',command=do_something_).pack(pady=10)

    clearall = Button(master, text='reset', command=resetAll).pack(pady=10)

    def resetAll():

        master.destroy()

        master = Tk()

mainloop()

Есть ли способ полностью сбросить окно?

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Вы можете создать функцию, которая создаст Frame и поместит виджеты в этот кадр.И тогда вы можете поместить рамку в окно.

Когда вы нажимаете кнопку, вы можете destroy() этот кадр удалить все виджеты, и вы можете запустить ту же функцию, чтобы снова создавать виджеты.Или вы можете запустить другую функцию для создания другого фрейма с виджетами - так что вы можете заменить содержимое в окне.

from tkinter import *

# --- functions ---

def create_frame(master):
    print("create frame")

    frame = Frame(master)

    b = Button(frame, text='Do Something')
    b.pack(pady=10)

    clearall = Button(frame, text='reset', command=reset_all)
    clearall.pack(pady=10)

    return frame

def reset_all():
    global frame

    frame.destroy()
    frame = create_frame(master)
    #frame = create_different_frame(master)
    frame.pack()

# --- main ---


master = Tk()

frame = create_frame(master)
frame.pack()

mainloop()

Кстати: если вы делаете var = Widget().pack(), тогда вы назначаете None на var, и у вас нет доступа к виджету - т.е.Вы не можете разрушить это.Вы должны сделать это в два шага

var = Widget()
var.pack()

, если вам не нужен доступ к виджету, тогда вам не нужна переменная

Widget().pack()

И когда у вас есть доступ ко всем виджетамзатем вы можете изменить настройки (т. е. открытый текст) в каждом виджете вместо того, чтобы уничтожать все виджеты.

0 голосов
/ 14 апреля 2019

Вы можете создать холст (или рамку), а затем сделать кнопки DoThing и clearall иметь холст (или рамку) в качестве основного виджета. Затем вы можете заставить подпрограмму resetAll уничтожить холст (или рамку). Это также уничтожит все дочерние виджеты холста.

Примечание: я также исправил некоторые синтаксические ошибки в вашем коде (например, вы определили подпрограмму resetALL после ссылки на нее.)

Код:

from tkinter import *

master = Tk()

def do_something_():
    print('do something') #I added this so that i can run the code with no errors
    #*performing a function on widget*

def resetAll():
    canvas.destroy() #destroys the canvas and therefore all of its child-widgets too


canvas = Canvas(master)
canvas.pack()
#creates the cnvas

DoThing = Button(canvas, text='Do Something',command=do_something_).pack(pady=10) 
#its master widget is now the canvas

clearall = Button(canvas, text='reset', command=resetAll).pack(pady=10)
#its master widget is now the canvas

master.mainloop()

Я запустил этот код.

Это был графический интерфейс до того, как я нажал кнопку сброса:

gui1

Это был графический интерфейс после того, как я нажал кнопку сброса:

gui2

Как видите, это сработало. Дочерние виджеты холста (кнопки) были уничтожены, потому что холст был уничтожен.

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