Как заставить tkinter gui обновлять на основе результатов кода, запущенного в другом потоке? - PullRequest
0 голосов
/ 29 ноября 2018

В настоящее время я работаю над небольшим проектом в Python 3, используя tkinter и threading, чтобы создать программу, которая работает в режиме реального времени вместе с пользовательским вводом.Точнее говоря, проблема в том, что я не могу обновить графический интерфейс tkinter из отдельного потока.Я пробовал несколько методов, включая метод .set, .update_idletasks и запуск потока из обратного вызова, но я не могу заставить его работать вообще.Ниже приведена короткая попытка, которая запускает поток, который должен продолжать увеличивать счетчик после нажатия кнопки в графическом интерфейсе.

from tkinter import *
import threading

var = 0
class thread1 (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
       while True:
           global var
           while True:
               var+=1
               window.update_idletasks()
examplethread = thread1(1, "example", 1)

window = Tk()
text = Label(window, text=var)
button = Button(window, text = "launch thread", command=examplethread.start)
text.pack()
button.pack()
window.mainloop

Это не работает, вместо этого я выдаю ошибку, которая, как я знаю, говорит, что яя не могу использовать команды tkinter вне потока, в котором работает mainloop (). Мне было интересно, можно ли получить графический интерфейс tkinter для обновления на основе результатов кода, который зацикливается в фоновом режиме, так как ввод другого игрока вводится вв то же время.

1 Ответ

0 голосов
/ 29 ноября 2018
  1. tkinter Labels используйте аргумент textvariable, а не text, чтобы установить используемую переменную.

  2. переменных, которые будут использоваться с вашим ярлыком, не былообъявлен как StringVar()

  3. Вы должны использовать .set() для присвоения значений вашим StringVar() переменным, а не обычному присваиванию Python.

  4. Сделайте счетчик с одной переменной, а затем установите var на эту переменную

  5. Кажется, вы вызывали неправильный метод start, пока в вашем коде было run

    from tkinter import *
    import threading
    count=0
    class thread1 (threading.Thread):
        def __init__(self, threadID, name, counter):
            threading.Thread.__init__(self)
            self.threadID = threadID
            self.name = name
            self.counter = counter
       def run(self):
            while True:
                global count
                #while True:
                count+=1
                var.set(count)
                window.update_idletasks()
    
    
    
    examplethread = thread1(1, "example", 1)
    
    window = Tk()
    var=StringVar()
    var.set(0)
    text = Label(window, textvariable=var)
    button = Button(window, text = "launch thread", command=examplethread.run)
    text.pack()
    button.pack()
    window.mainloop
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...