Python - Как заставить tkinter поля ввода исчезнуть после изменения выбора - PullRequest
0 голосов
/ 16 ноября 2018

Когда я запускаю свой скрипт Python GUI, он даст вам выпадающий список для выбора веб-сайта.Раскрывающийся список читает из списка, который называется «сайты».Когда я выбираю «Fareham», появляются кнопки, которые дают мне выбор «Custom Date», «Last Week», «Week to Current», если я нажимаю «Custom date», появляются 2 поля ввода, если я меняю свой выбор, нажимая «week toтекущее «1 поле ввода должно появиться.

Когда я нажимаю« неделя к текущей »сразу после нажатия« пользовательская дата », 2 поля ввода« пользовательская дата »не исчезают.Как я могу сделать так, чтобы поля ввода исчезали при изменении моего выбора?

Код:

import os
import tkinter
from tkinter import ttk

sites = [
    "Fareham",
    "Hants",
    "Southampton",
    "Eastleigh",
    "Havant",
    "Gosport",
]

win = tkinter.Tk()

win.geometry("500x500")

win.title("UK Council Web Scraping GUI | Sites Loaded: %s" % len(sites))

tkinter.Label(win, text="Database Path").grid(row=0, sticky="W")

entry1 = tkinter.Entry(win)
entry1.insert(0, "")
entry1.grid(row=0, column=1, sticky="W")

tkinter.Label(win, text="Log File Path").grid(row=1, sticky="W")

entry2 = tkinter.Entry(win)
entry2.insert(0, "")
entry2.grid(row=1, column=1, sticky="W")

tkinter.Label(win, text="Chrome Driver Path").grid(row=2, sticky="W")

entry3 = tkinter.Entry(win)
entry3.insert(0, "")
entry3.grid(row=2, column=1, sticky="W")

variable = tkinter.StringVar(win)
variable.set("Select Website")

homepath = "%homepath%"
choice = 0

def check(*args):
    global choice
    def custom():
        global choice
        choice = 1
        tkinter.Label(win, text="Start Date").grid(row=15, column=0)
        entry4 = tkinter.Entry(win)
        entry4.insert(0, "")
        entry4.grid(row=16, column=0)
        tkinter.Label(win, text="Stop Date").grid(row=15, column=1)
        entry5 = tkinter.Entry(win)
        entry5.insert(0, "")
        entry5.grid(row=16, column=1)

    def week():
        global choice
        choice = 2

    def wtc():
        global choice
        choice = 3
        tkinter.Label(win, text="Weeks").grid(row=15, column=0)
        entry4 = tkinter.Entry(win)
        entry4.insert(0, "")
        entry4.grid(row=16, column=0)

    if args[0] == "Fareham" or args[0] == "Southampton" or args[0] == "Eastleigh" or args[0] == "Havant" or args[0] == "Gosport":
        button1 = tkinter.Button(win, text="Custom Date", height=2, width=12, command=custom).grid(row=3, column=0, sticky="W")
        button2 = tkinter.Button(win, text="Last Week", height=2, width=12, command=week).grid(row=4, column=0, sticky="W")
        button3 = tkinter.Button(win, text="Week to Current", height=2, width=12, command=wtc).grid(row=5, column=0, sticky="W")
    else:
        choice = 0

drop = tkinter.OptionMenu(win, variable, *sites, command=check).grid(row=0, column=2, sticky="E")

def scrape(*args):
    global choice
    if choice == 0:
        os.system(r"cd %s\Anaconda3 && python %s\Desktop\code\urls\%s.py %s %s %s" % (homepath, homepath, variable.get().lower(), entry1.get(), entry2.get(), entry3.get()))

    if choice == 1:
        os.system(r"cd %s\Anaconda3 && python %s\Desktop\code\urls\%s.py %s %s %s 1 %s %s" % (homepath, homepath, variable.get().lower(), entry1.get(), entry2.get(), entry3.get(), entry4.get(), entry5.get()))

    if choice == 2:
        os.system(r"cd %s\Anaconda3 && python %s\Desktop\code\urls\%s.py %s %s %s 2" % (homepath, homepath, variable.get().lower(), entry1.get(), entry2.get(), entry3.get()))

    if choice == 3:
        os.system(r"cd %s\Anaconda3 && python %s\Desktop\code\urls\%s.py %s %s %s 3 %s" % (homepath, homepath, variable.get().lower(), entry1.get(), entry2.get(), entry3.get(), entry4.get()))

button4 = tkinter.Button(win, text="Scrape Website", height=2, width=12, command=scrape).grid(row=6, column=0, sticky="W")

win.mainloop()

1 Ответ

0 голосов
/ 16 ноября 2018

Виджеты Entry не исчезают, потому что вы им не сказали.

Вам нужно дать команду удалить виджеты, чтобы они ушли.

Виджеты уничтожаются с помощью функции .destroy().Для этого вам потребуется способ обращения к двум виджетам entry4 и entry5 вне функции, в которой они объявлены.Для этого есть два простых метода.

Первый (и я бы порекомендовал) перейти к стилю ООП в вашей программе.Ответ Брайана здесь является хорошей отправной точкой для достижения этого.

Во-вторых, необходимо сделать переменные глобальными, для этого потребуется добавить приведенный ниже фрагмент в функцию custom():

global entry4
global entry5

В любом случае, вы сможете ссылаться на виджеты вне функции и затем вызывать .destroy() для них, как показано ниже:


Метод 1:

CLASS_NAME.entry4.destroy()
CLASS_NAME.entry5.destroy()

Метод 2:

global entry4
global entry5
entry4.destroy()
entry5.destroy()

Обратите внимание, однако, что это не разрушает созданные вами ярлыки.Поскольку это анонимные виджеты, их будет сложнее удалить.Проверьте этот ответ для получения дополнительной информации.

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