Я создаю программу на 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