использование многопоточности для выполнения простой оконной программы - PullRequest
0 голосов
/ 25 января 2020

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

from difflib import get_close_matches
from tkinter import *


data = {'Bob':'23', 'Sahil':'17', 'Swami':'34', 'Vaibhav':'21'}

def translate(w):
    w = w.lower()
    if w in data.keys():
        return data[w]
    elif w.title() in data.keys():
         return data[w.title()]
    elif w.upper() in data.keys():
         return data[w.upper()]
    elif len(get_close_matches(w, data.keys(), cutoff=0.8)) > 0:
        yn = input(
            "Did u mean %s instead? Enter y if yes, or any key if no :" % get_close_matches(w, data.keys(), cutoff=0.8)[
                0])
        if yn == 'y':
            return data[get_close_matches(w, data.keys(), cutoff=0.8)[0]]
        elif yn != 'y' and len(get_close_matches(w, data.keys(), cutoff=0.8)) > 1:
            yn2 = input("Did u mean %s instead? Enter y if yes, or any key if no :" %
                        get_close_matches(w, data.keys(), cutoff=0.8)[1])
            if yn2 == 'y':
                return data[get_close_matches(w, data.keys(), cutoff=0.8)[1]]
            elif yn2 != 'y' and len(get_close_matches(w, data.keys(), cutoff=0.8)) > 2:
                yn3 = input("Did u mean %s instead? Enter y if yes, or any key if no :" %
                            get_close_matches(w, data.keys(), cutoff=0.8)[2])
                if yn3 == 'y':
                    return data[get_close_matches(w, data.keys(), cutoff=0.8)[2]]
                elif yn3 != 'y':
                    return "The word doesn't exist in this dictionary"
            else:
                return "I cannot find this in dictionary"
        else:
            return "I cannot find this in dictionary"
    else:
        return "The word doesn't exist in this dictionary"
    try:
        t.insert(INSERT, word)

    except:
        t.insert(INSERT, "sorry")


while True:
    word = input("Please enter your word:")
    output = translate(word)
    if type(output) == list:
        for i in output:
            print(i)
    else:
        print(output)
    root = Tk()
    t = Text(root)
    t.pack()
    t.insert(INSERT, word)
    t.insert(INSERT, translate(word))
    root.mainloop()

1 Ответ

0 голосов
/ 25 января 2020

Обратите внимание, что вы вызываете функцию input перед вызовом Tk. Вот почему ваш код запрашивает ввод перед тем, как отобразить окно.

Но есть кое-что более базовое c, которое необходимо изменить.

Когда вы используете 'Tk', он будет обрабатывать ввод вид, для которого вы используете input. (Вам это вообще не понадобится.)

Я бы порекомендовал вам следовать руководству по https://tkdocs.com/tutorial/. На нескольких экранах урока вы сможете сделать то, что вы хотите.

Удачи!

Приложение:

Возьмите код Python из урока страница в https://tkdocs.com/tutorial/firstexample.html в качестве отправной точки. (Использование рабочего примера в качестве исходного места часто является хорошей стратегией.)

Просто замените идентификаторы и строки символьными строками, которые имеют смысл в вашем контексте. Затем замените код, который выполняет фактический расчет, на нужный вам расчет. Вот упрощенный код для вашей ситуации.

Обратите особое внимание на то, что вы используете .get в Tk для получения содержимого поля и .set для помещения чего-либо на дисплей.

from tkinter import *
from tkinter import ttk
from difflib import get_close_matches

data = {'Bob':'23', 'Sahil':'17', 'Swami':'34', 'Vaibhav':'21'}

def Find(*args):
    try:
        value = word.get().lower().title()
        result.set(data[value])
    except ValueError:
        pass

root = Tk()
root.title("Example for Sahil")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

word = StringVar()
result = StringVar()

word_entry = ttk.Entry(mainframe, width=7, textvariable=word)
word_entry.grid(column=2, row=1, sticky=(W, E))

ttk.Label(mainframe, textvariable=result).grid(column=2, row=2, sticky=(W, E))
ttk.Button(mainframe, text="Find", command=Find).grid(column=3, row=3, sticky=W)

ttk.Label(mainframe, text="word").grid(column=3, row=1, sticky=W)
ttk.Label(mainframe, text="is equivalent to").grid(column=1, row=2, sticky=E)
ttk.Label(mainframe, text="result").grid(column=3, row=2, sticky=W)

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

word_entry.focus()
root.bind('<Return>', Find)

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