Просмотр и взаимодействие с функцией, которая требует ввода пользователя в Tkinter - PullRequest
0 голосов
/ 23 октября 2019

Я создаю приложение с Tkinter, и для приложения мне нужно использовать функцию в пакете, который требует ввода данных пользователем. Я пытаюсь использовать sys.stdout в потоке и выводить sys.stdout в Listbox(), это работает для моей другой функции, выполняющей аналогичные действия, но пользовательский ввод отсутствует. В первой строке этой темы я изменяю кнопку, затем выполняю операцию, и кнопка не меняется, и приложение переходит в неотвечающий. Мой вопрос: будет ли sys.stdout отправлять то, что запрашивает вход? и Как я могу отправить пользовательский ввод из поля ввода в функцию, пока она еще работает в потоке? Заранее благодарим усеченный код ниже:


class Login(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)

        global Key
        global button1

        Key = tk.StringVar()

        #Buttton to start thread
        button1 = ttk.Button(self, text='Login',command=lambda:Setupthread2(lbx,button1,Key,KeyEntry))
        button1.pack()

        #Entry for user to input
        KeyEntry = tk.Entry(self, show= '*', textvariable=Key)
        KeyEntry.pack()

        scb = tk.Scrollbar(self)
        scb.pack(fill='y' ,side='right')
        lbx = tk.Listbox(self, yscrollcommand=scb.set)
        lbx.pack()

        scb.config(command=lbx.yview)

def Setupthread2(object,button1,Key,KeyEntry):

    global flag

    send_process = threading.Thread(target=callback(object,button1,Key,KeyEntry))
    send_process.start()
    flag = False

def callback(object,button1,Key,KeyEntry):

    #Changing the button so I can use the same button for both starting the tread and to send to sample func
    button1.config(text = 'Send Code', command = lambda:SendUsrInput(Key,KeyEntry))
    old_stdout = sys.stdout
    sys.stdout = StdoutRedirectorLabel(object)
    sample()
    sys.stdout = old_stdout

    #After Output finished set scrollbar to bottom
    object.yview_moveto(1.0)

class StdoutRedirectorLabel(object):

    def __init__(self,widget):
        self.widget = widget

    def write(self,text):
        self.widget.insert('anchor',text)

# Me trying to send what they type in entry box to function
def SendUsrInput(Key,KeyEntry):

    Key = Key.get()
    print(Key)
    KeyEntry.delete(0,'end')

#Truncated version of the function I need to show console and to send input to
def sample():
    usrInput = input('Enter Input to get something Back')
    print(usrInput + ' Was my input')

1 Ответ

0 голосов
/ 28 октября 2019

Таким образом, в модуле, где он запрашивает пользовательский ввод с помощью, я сделал окно Tk, запрашивающее ввод с таймаутом, используя after()

def sample()
   sms_code = loginTimeout()

def loginTimeout():
    root = tk.Tk()
    sms_code = ''
    def get_entry() -> str:
        """Gets and returns the entry input, and closes the tkinter window."""
        nonlocal sms_code
        sms_code = entry_var.get()
        root.destroy()
        return sms_code

    # Your input box
    entry_var = tk.StringVar()
    tk.Tk.wm_title(root,'Trading Bot')
    tk.Label(root, text='Please Enter the Authorization Code').pack()
    tk.Entry(root, textvariable=entry_var).pack()

    # A button, or could be an event binding that triggers get_entry()
    tk.Button(root, text='Confirm', command=get_entry).pack()

    # This would be the 'timeout'
    root.after(300000, get_entry)
    root.mainloop()
    return sms_code
...