Повторное нажатие кнопки Tkinter - PullRequest
0 голосов
/ 10 июня 2018

Как сделать так, чтобы при каждом нажатии кнопки он снова запускался.т.е. я ввожу «БОЛЬШОЙ» и нажимаю кнопку -> возвращает ответ, затем я изменяю «БОЛЬШОЙ» на «МАЛЕНЬКИЙ» и нажимаю снова, но ничего не происходит, но я хочу, чтобы он снова выполнял поиск и возвращал результат.

from tkinter import *


def part_search():

    Finder = ()
    scrollbar = Scrollbar(mGui)
    scrollbar.pack(side=RIGHT, fill=Y)
    listbox = Listbox(mGui)
    listbox.pack(fill=BOTH, expand=1)
    listbox.configure(justify=CENTER, bg="orange", font="Times 16")
    mtext = ment.get()
    mlabel2 = Label(mGui, text=mtext)
    mlabel2.pack()
    msearch = open(r"D:\Users\gblmac\Desktop\Python programs\Parts List\Parts.txt")

    for line in msearch:
          if mtext in line:
              listbox.insert(END, str(line))

    listbox.config(yscrollcommand=scrollbar.set, height=30, width=0, justify=LEFT)
    scrollbar.config(command=listbox.yview)
    msearch.close()



    return

mGui = Tk()
mGui.configure(bg="orange")
ment = StringVar()

mGui.geometry ("1000x500+200+300")
mGui.title ("Parts Finder")

mlabel1 = Label(mGui, text="Type in search term", font="Times 20", bg="orange")
mlabel1.pack()
mentry = Entry(textvariable=ment, font="Times 20", width = 50, bg="orange")
mentry.pack()
mentry.focus()
mlabel3 = Label(mGui, text="Now click GO", font="Times 20", bg="orange")
mlabel3.pack()

mbutton = Button(mGui, text ="Go", font="Times 20", command = part_search, bg="grey")
mbutton.pack()

1 Ответ

0 голосов
/ 10 июня 2018

Что ж, у вас есть некоторые проблемы при создании элементов.
Сначала я предоставлю исправленный код, а затем объясню:

from tkinter import *

def part_search():
    # The sole purpose of this function is to update elements, not creating them.
    mtext = ment.get()
    print(mtext)
    mlabel2.config(text=mtext)
    msearch = open(r"Parts.txt")
    print('again')
    for line in msearch:
          if mtext in line:
              listbox.insert(END, str(line))

    listbox.config(yscrollcommand=scrollbar.set,width=0, justify=LEFT)
    scrollbar.config(command=listbox.yview)
    msearch.close()

    return

# This code is your original code for creating the first elements
mGui = Tk()
mGui.configure(bg="orange")
ment = StringVar()


mGui.geometry ("1000x500+200+300")
mGui.title ("Parts Finder")

mlabel1 = Label(mGui, text="Type in search term", font="Times 20", bg="orange")
mlabel1.pack()
mentry = Entry(textvariable=ment, font="Times 20", width = 50, bg="orange")
mentry.pack()
mentry.focus()
mlabel3 = Label(mGui, text="Now click GO", font="Times 20", bg="orange")
mlabel3.pack()

mbutton = Button(mGui, text ="Go", font="Times 20", command = part_search, bg="grey")
mbutton.pack()

# here is the moved code from the function
Finder = ()
scrollbar = Scrollbar(mGui)
scrollbar.pack(side=RIGHT, fill=Y)
listbox = Listbox(mGui)
listbox.pack(fill=BOTH, expand=1)
listbox.configure(justify=CENTER, bg="orange", font="Times 16")
mlabel2 = Label(mGui)
mlabel2.pack()

while True:
    # ball.draw()
    mGui.update_idletasks()
    mGui.update()

Что случилось?

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

Вы должны использовать макет Tkсхемы (укладка, укладка и т. д.).См. Официальную документацию здесь

Как можно избежать ошибок этого типа?

Вы должны разделить код, который создает пользовательский интерфейс, и код, которыйпредоставлять ему информацию и реагировать на действия пользователя.Быстрый поиск в YouTube и базовые учебники помогут вам начать.Гораздо проще решать одну проблему за раз, и существует множество шаблонов и знаний о дизайне пользовательского интерфейса, это действительно полезно даже для разработчиков и исследователей бэкэнда, которые создают пользовательские интерфейсы только для POC.

Удачи!

...