如何从生成GUI小部件的函数外部管理GUI小部件(删除/隐藏它)

2024-03-28 19:36:38 发布

您现在位置:Python中文网/ 问答频道 /正文

代码是一个生成密码的程序,
easy是一个名字,
中间是一个名称+3个随机符号,
硬盘提供了选择密码长度的可能性,这是随机符号的复杂性


“开始框架”提供了英语和波尔斯基语之间的选择, 以下波兰语或英语框架给出了相同的可能性。不同的名字会有不同的难度

我正在学习Python GUI tkinter,遇到了一个问题,因为正如标题所说,我有一个小部件需要删除,方法是使用一个按钮“后退”,该按钮链接到另一个函数,该函数将在顶部显示“开始帧”,并删除由函数“easy”、“medium”创建的小部件,“困难”来自“英语难度”框架,因此有点“忘记进度”

您可能会发现一些类似的代码,但链接到另一个名称略有不同的函数,这是因为从开始帧可以选择语言-波兰语和英语。波兰语部分的代码有镜像

99行是我的try,def start\u frame\u del\u小部件 输出是(示例)“输入\文本未定义”,如何使函数看到它

import tkinter
import tkinter.ttk
from tkinter import *
import random

def convert(password):
    pas = str("".join(map(str, password)))
    return pas

imiona = ["Ada", "Adela", "Adelajda", "Adrianna", "Agata", "Agnieszka", "Aldona", "Aleksandra", "Alicja", "Alina", "Amanda", "Amelia", "Anastazja", "Andżelika", "Aneta", "Anita", "Anna", "AntoninaBarbara", "Beata", "Berenika", "Bernadeta", "Blanka", "Bogusława", "BożenaCecylia", "Celina", "CzesławaDagmara", "Danuta", "Daria", "Diana", "Dominika", "DorotaEdyta", "Eliza", "Elwira", "Elżbieta", "Emilia", "Eugenia", "Ewa", "EwelinaFelicja", "FranciszkaGabriela", "GrażynaHalina", "Hanna", "HelenaIga", "Ilona", "Irena", "Irmina", "Iwona", "IzabelaJadwiga", "Janina", "Joanna", "Jolanta", "Jowita", "Judyta", "Julia", "Julita", "JustynaKamila", "Karina", "Karolina", "Katarzyna", "Kazimiera", "Kinga", "Klaudia", "Kleopatra", "Kornelia", "KrystynaLaura", "Lena", "Leokadia", "Lidia", "Liliana", "Lucyna", "Ludmiła", "LuizaŁucjaMagdalena", "Maja", "Malwina", "Małgorzata", "Marcelina", "Maria", "Marianna", "Mariola", "Marlena", "Marta", "Martyna", "Marzanna", "Marzena", "Matylda", "Melania", "Michalina", "Milena", "Mirosława", "MonikaNadia", "Natalia", "Natasza", "Nikola", "Nina", "Olga", "Oliwia", "Otylia","Pamela", "Patrycja", "Paula", "PaulinaRegina", "Renata", "Roksana", "Róża", "RozaliaSabina", "Sandra", "Sara", "Sonia", "Stanisława", "Stefania", "Stella", "Sylwia"]

signs=["A","a","B","b","C","c","D","d","E","e","F","f","G","g","H","h","I","i","J","j","K","k","L","l","M","m","N","n","O","o","P","p","R","r","S","s","T","t","U","u","","w","Y","y","Z","z","0","1","2","3","4","5","6","7","8","9","!","@","$","%","^","&","*","(",")","#"]
########################### Dokonalem zmian w liniach 49, 63, 67, 121

#przyciski na startowej ramce
def start_frame_buttons():
    start_wind_eng=tkinter.Button(start_frame, text="English", bg="blue", fg="white", command=dif_eng_fr)
    start_wind_eng.grid(column=0, row=0, sticky=(tkinter.N))
    start_wind_pl=tkinter.Button(start_frame, text="Polish", bg="red", fg="white", command=dif_pl_fr)
    start_wind_pl.grid(column=1, row=0, sticky=(tkinter.N))

#przyciski trudnosci na english ramce
def difficulty_eng_frame_buttons():
    eng_frame_easy=tkinter.Button(eng_difficulty_f2, text="Easy", bg="white", fg="blue", command=easy)
    eng_frame_easy.grid(column=0, row=0, sticky=(tkinter.N))
    eng_frame_medium=tkinter.Button(eng_difficulty_f2, text="Medium", bg="yellow", fg="black", command=medium)
    eng_frame_medium.grid(column=2, row=0, sticky=(tkinter.N))
    eng_frame_hard=tkinter.Button(eng_difficulty_f2, text="Hard", bg="black", fg="yellow", command=hard)
    eng_frame_hard.grid(column=4, row=0, sticky=(tkinter.N)) 
    start_frame_comeback=tkinter.Button(eng_difficulty_f2, text="back", bg="white", fg="black", command=start_fr)
    start_frame_comeback.grid(column=4, row=3, sticky=(tkinter.N))

#przyciski trudnosci na polskiej ramce
def difficulty_pl_frame_buttons():
    pl_frame_easy=tkinter.Button(pl_difficulty_f2, text="Łatwe", bg="white", fg="blue", command=easypl)
    pl_frame_easy.grid(column=0, row=0, sticky=(tkinter.N))
    pl_frame_medium=tkinter.Button(pl_difficulty_f2, text="Średnie", bg="yellow", fg="black", command=mediumpl)
    pl_frame_medium.grid(column=2, row=0, sticky=(tkinter.N))
    pl_frame_hard=tkinter.Button(pl_difficulty_f2, text="Trudne", bg="black", fg="yellow", command=hardpl)
    pl_frame_hard.grid(column=4, row=0, sticky=(tkinter.N))

    start_frame_comeback=tkinter.Button(pl_difficulty_f2, text="wstecz", bg="white", fg="black", command=start_fr)
    start_frame_comeback.grid(column=4, row=3, sticky=(tkinter.N))

#latwe haslo
def easy():
    pas= random.choice(imiona)
    haslotxt=tkinter.ttk.Label(eng_difficulty_f2, text="PASSWORD:").grid(row=1, column=0)
    LabelText.set(pas)#Ustawiam nowa wartosc StringVar'a "LabelText"
    paslabele=tkinter.ttk.Label(eng_difficulty_f2, textvariable=LabelText).grid(row=1, column=2)#zamienilem "text",na "textvariable" w raz z nazwa "LabelText" tym sposobem przypisujesz z jakiego StringVar'a tekst ma sie wyswietlac

def easypl():
    pas= random.choice(imiona)
    haslotxt=tkinter.ttk.Label(pl_difficulty_f2, text="PASSWORD:").grid(row=1, column=0)
    LabelTextpl.set(pas)#Ustawiam nowa wartosc StringVar'a "LabelText"
    paslabele=tkinter.ttk.Label(pl_difficulty_f2, textvariable=LabelTextpl).grid(row=1, column=2)#zamienilem "text",na "textvariable" w raz z nazwa "LabelText" tym sposobem przypisujesz z jakiego StringVar'a tekst ma sie wyswietlac


#srednie haslo
def medium():
    password = random.choice(imiona)
    i=1
    pas = ''
    while i<=3:
        sign = random.choice(signs)
        i=i+1
        pas = pas + sign
    haslotxt=tkinter.ttk.Label(eng_difficulty_f2, text="PASSWORD:").grid(row=1, column=0)
    LabelText.set(password+pas)#Ustawiam nowa wartosc StringVar'a "LabelText"
    paslabelm=tkinter.ttk.Label(eng_difficulty_f2, textvariable=LabelText).grid(row=1, column=2)

def mediumpl():
    password = random.choice(imiona)
    i=1
    pas = ''
    while i<=3:
        sign = random.choice(signs)
        i=i+1
        pas = pas + sign
    haslotxt=tkinter.ttk.Label(pl_difficulty_f2, text="PASSWORD:").grid(row=1, column=0)
    LabelTextpl.set(password+pas)#Ustawiam nowa wartosc StringVar'a "LabelText"
    paslabelm=tkinter.ttk.Label(pl_difficulty_f2, textvariable=LabelTextpl).grid(row=1, column=2)


#trudne haslo
def hard(): 
    input_text=tkinter.Entry(eng_difficulty_f2, textvariable=EntryText)
    input_text.grid(column=0, row=3) 
    haslotxt=tkinter.ttk.Label(eng_difficulty_f2, text="PASSWORD:").grid(row=1, column=0)
    paslabelm=tkinter.ttk.Label(eng_difficulty_f2, textvariable=LabelText).grid(row=1, column=2)

def hardpl(): 
    input_text=tkinter.Entry(pl_difficulty_f2, textvariable=EntryTextpl)
    input_text.grid(column=0, row=3) 
    tkinter.ttk.Label(pl_difficulty_f2, text="PASSWORD:").grid(row=1, column=0)
    tkinter.ttk.Label(pl_difficulty_f2, textvariable=LabelTextpl).grid(row=1, column=2)

#wyswietla wybór języka oraz usuwa stworzone widgety z ramki
def start_fr_del_widget():
    pl_difficulty_f2.grid_forget()
    eng_difficulty_f2.grid_forget()
    start_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
    input_text.grid_remove(eng_difficulty_f2)
    haslotxt.grid_remove()
    paslabelm.grid_remove()

#wyswietl ramke start
def start_fr():
    # This function can only be called from the second window.
    # Hide the second window and show the third window.
    eng_difficulty_f2.grid_forget()
    pl_difficulty_f2.grid_forget()
    start_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))

#wyswietl english ramke
def dif_eng_fr():
    # This function can only be called from the second window.
    # Hide the second window and show the third window.
    start_frame.grid_forget()
    eng_difficulty_f2.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))

#wyswietl polska ramka
def dif_pl_fr():
    # This function can only be called from the second window.
    # Hide the second window and show the third window.
    start_frame.grid_forget()
    pl_difficulty_f2.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))
#STWORZENIE OKNA, WYMIARY, TITLE RESAZIBLE
wind=tkinter.Tk()
wind_wd=700
wind_ht=200
wind.title("Password Generator / Generator Hasła")

#tworzenie ramki start
start_frame=tkinter.ttk.Frame(wind, width=wind_wd, height=wind_ht)
start_frame['borderwidth'] = 2
start_frame['relief'] = 'sunken'
start_frame.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))

#tworzenie ramki engielskiej
eng_difficulty_f2=tkinter.ttk.Frame(wind, width=wind_wd, height=wind_ht)
eng_difficulty_f2['borderwidth'] = 2
eng_difficulty_f2['relief'] = 'sunken'
eng_difficulty_f2.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))

#tworzenie ramki polskiej
pl_difficulty_f2=tkinter.ttk.Frame(wind, width=wind_wd, height=wind_ht)
pl_difficulty_f2['borderwidth'] = 2
pl_difficulty_f2['relief'] = 'sunken'
pl_difficulty_f2.grid(column=0, row=0, padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E))

#### PO row=0 było " padx=20, pady=5, sticky=(tkinter.W, tkinter.N, tkinter.E)", ale redukcja
#Funkcja uruchamiana przy zmianie tekstu w input_text
def EntryChanged(a,b,c):   #te parametry a b c sa tylko przez to ze funkcja crashowala bez nich 
    length=EntryText.get()
    length = int(length)
    l=0
    password = []
    while l<length:
        sign = random.choice(signs)
        i=l-1
        password.insert(i, sign)
        l=l+1
    passhard=convert(password)
    LabelText.set(passhard)

def EntryChangedpl(a,b,c):   #te parametry a b c sa tylko przez to ze funkcja crashowala bez nich 
    lengthpl=EntryTextpl.get()
    lengthpl = int(lengthpl)
    k=0
    password = []
    while k<lengthpl:
        sign = random.choice(signs)
        i=k-1
        password.insert(i, sign)
        k=k+1
    passhard=convert(password)
    LabelTextpl.set(passhard)
#Zmienne globalne
EntryText = tkinter.StringVar()  #StringVar to specjalny rodzaj stringa z tkinter, przy zmianie automatycznie aktualizuje tekst w labele'ach korzystajacych z niego 
EntryText.set("") 
EntryText.trace("w", EntryChanged) # StringVar'a mozna tez urzyc do sprawdzenia czy tekst zostal edytowany, "EntryChanged" to nazwa funkcji ktora zostanie uruchomiona po wykryciu zmiany w tekscie
LabelText = tkinter.StringVar()
LabelText.set("")

EntryTextpl = tkinter.StringVar()  #StringVar to specjalny rodzaj stringa z tkinter, przy zmianie automatycznie aktualizuje tekst w labele'ach korzystajacych z niego 
EntryTextpl.set("") 
EntryTextpl.trace("w", EntryChangedpl) # StringVar'a mozna tez urzyc do sprawdzenia czy tekst zostal edytowany, "EntryChanged" to nazwa funkcji ktora zostanie uruchomiona po wykryciu zmiany w tekscie
LabelTextpl = tkinter.StringVar()
LabelTextpl.set("")

#TWORZENIE WIDGETÓW W RAMKACH
start_frame_buttons()
difficulty_eng_frame_buttons()
difficulty_pl_frame_buttons()

eng_difficulty_f2.grid_forget()
pl_difficulty_f2.grid_forget()

wind.mainloop()

我希望“后退”按钮转到“开始帧”(就像现在一样),当我再次按下“英语”时,它将只显示这3个难度按钮和“后退”按钮


Tags: texttkinterdefcolumnframestartenggrid