Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 25, 2016 18:26:41

alexvert
Зарегистрирован: 2016-04-25
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

GUI tkinter зависание интерфейса

Здравствуйте

Мне нужно сделать простой интерфейс для программы. При нажатии на кнопку Start запуск программы, при нажатии на кнопку Stop (или даже лучше на ту же кнопку повторно) остановка, при нажатии на QUIT выход из программы. Я попробовал несколько вариантов, но интерфейс зависает, когда я нажимаю на стоп, а то и при нажатии на старт, сама же программа успешно продолжает работать в интерпретаторе. Программа состоит из трех блоков Try внутри бесконечного цикла while True, если в блоке try1 состоялось определенное условие, программа пропускает следующий блок try2 и начинает новый цикл. Если условие было иным программа переходит ко второму блоку try2, далее процедура, затем try3, после чего новый цикл, время каждого процесса отдельно внутри одного блока или всего цикла вместе не должно быть чем-либо ограничено. На выполнение одного цикла может потребоваться от нескольких секунд до часа и больше если понадобится, зависит от времени самого ввода данных пользователем, в том числе и через голосовое распознавание. Я впервые работаю с tkinter и не совсем хорошо понимаю как это реализовать, поэтому нужна ваша помощь на каком-нибудь простом и действенном примере, чтобы понять что именно я делаю не так. Все нижеприведенные варианты сами по себе работают, но не с этим мне кодом. Единственное что требуется для моей программы это запустить её и прервать на любой стадии выполнения как этот делает IDE

вариант 1

import tkinter as Tk
import threading
import time

def task():
while not kill_switch.is_set():

print('ЗДЕСЬ КОД ПРОГРАММЫ')

time.sleep(1)

def start_thread():
global kill_switch, sub_thread
kill_switch = threading.Event()
sub_thread = threading.Thread(target=task)
sub_thread.start()

def stop_thread():
kill_switch.set()
sub_thread.join()

root = Tk.Tk()

Tk.Button(root, text='START', command=start_thread, height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='STOP', command=stop_thread, height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='QUIT', command=root.quit, height=5, width=20,).pack(side=Tk.LEFT)

root.mainloop()

вариант 2

import tkinter as Tk

root = Tk.Tk()
run = False

def worker():
print('ЗДЕСЬ КОД ПРОГРАММЫ')
if run:
root.after(500, worker)

def start_timer():
global run
run = True
root.after(0, worker)

def stop_timer():
global run
if run:
print('halting.')
run = False

Tk.Button(root, text='START', command=start_timer,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='STOP', command=stop_timer,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='QUIT', command=root.quit,
height=5, width=20,).pack(side=Tk.LEFT)

root.mainloop()

вариант 3

import tkinter as Tk

root = Tk.Tk()
root.title('Timer test')
root.geometry("200x100+200+200")

class TkJob:

def __init__(self, arange, brange, interval, root):
self.amin, self.amax = arange
self.bmin, self.bmax = brange
self.root = root
self.interval = interval
self.a, self.b = self.amin, self.bmin
self.run = False

def step(self):

if not self.run:
return

print('ЗДЕСЬ КОД ПРОГРАММЫ')

if self.run:
self.root.after(self.interval, self.step)

def start(self):
print('job is running.')
self.run = True

def stop(self):
print('job is halted.')
self.run = False

def start_job():
j.start()
root.after(0, j.step)

def stop_job():
if j.run:
print('halting.')
j.stop()

j = TkJob((0, 3), (0, 5), 500, root)

Tk.Button(root, text='START', command=start_job,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='STOP', command=stop_job,
height=5, width=20,).pack(side=Tk.LEFT)
Tk.Button(root, text='QUIT', command=root.quit,
height=5, width=20,).pack(side=Tk.LEFT)

root.mainloop()

Отредактировано alexvert (Апрель 25, 2016 18:43:30)

Офлайн

#2 Май 5, 2016 19:17:47

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

GUI tkinter зависание интерфейса

Попробовал 1-ый вариант. Ничего не виснет. Как у вас “зависание” проявляется?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version