Передать входное значение в качестве аргумента для функции в другом потоке - PullRequest
0 голосов
/ 10 апреля 2020

Я создаю программу на Python 3 с tkinter, для которой требуется кнопка паузы / воспроизведения, чтобы остановить и запустить al oop. Я делаю это с помощью многопоточности. Функция, которая запускает l oop, принимает аргумент, который является значением, введенным пользователем.

В приведенном ниже примере показана часть программы, над которой я работаю. Он основан на этом коде https://pastebin.com/qC37WJfA.

from tkinter import *
import itertools
import threading

global entry_text

#constants for threading
START = 1
STOP = 0
EXIT = -1

looping = STOP

#stores position of pause/play button
toggle_play_pause = itertools.cycle(['playing', 'paused'])

class ThreadingTest():

    def __init__(self, win):
        self.win = win
        self.win.title('Threading Test')

        entry_text = ''

        self.build_play_frame()

        thread = threading.Thread(target=test_loop, args=(entry_text,))
        thread.daemon = True
        thread.start()

    def build_play_frame(self):
        self.play_frame = Frame(self.win, width=150, height=250, padx=20)

        #creating widgets
        self.play_pause_button = Button(self.play_frame, text='play', command=self.on_play_pause_button_clicked)
        self.entry_field = Entry(self.play_frame)

        #mapping widgets to location
        self.play_pause_button.grid(row=1, column=0)
        self.entry_field.grid(row=0, column=0)
        self.play_frame.grid(row=0, column=0)

    #this function is ran when the play/pause button is clicked
    def on_play_pause_button_clicked(self):
        global looping
        global entry_text
        entry_text = self.entry_field.get()
        action = next(toggle_play_pause)
        if action == 'playing':
            self.play_pause_button.config(text='Pause')
            looping = START
        else:
            self.play_pause_button.config(text='Play')
            looping = STOP

def run():
    win = Tk()
    ThreadingTest(win)
    win.mainloop()
    looping = EXIT

def test_loop(text):
    while True:
        if looping == START:
            print(text)
        if looping == EXIT:
            break

if __name__ == '__main__':
    run()

Программа должна взять ввод из поля ввода и продолжить печать этого значения, когда нажимается кнопка паузы / воспроизведения, пока она не будет нажата снова, чтобы остановить ее. Проблема в том, что переменная entry_text не обновляется и поэтому печатает пустую строку, присвоенную ей в начале, а не текст в поле ввода. Я предполагаю, что это потому, что здесь передается значение переменной, а не фактическая переменная.

thread = threading.Thread(target=test_loop, args=(entry_text,))

Любое руководство относительно того, как заставить это работать, будет очень цениться. Большое спасибо, Чарл ie

...