Найти - Пользователи
Полная версия: Tkinter и потоки
Начало » GUI » Tkinter и потоки
1 2 3
igor.kaist
Имеется интерфейс, написанный на Tkinter (не уговаривайте использовать другую библиотеку),
так же имеется отдельный поток, который занимается своим очень важным делом :)… Примерно так:
from Tkinter import *
import thread,time

root=Tk()
def title():
time.sleep(2)
root.title('test')

thread.start_new_thread(title,())
root.mainloop()
как и ожидалось приложение виснет через 2 секунды.. Как можно побороть недуг?
Из гуи потока во второй данные передаю через Queue (страшное название модуля :)
gmorgunov
Здравствуйте.
Питоном только начал заниматься, но по аналогии с С-потоками по-моему так:
from Tkinter import *
import thread,time

root=Tk()
root.title("test_process")
def title():
time.sleep(2)
root.title("test_thread")

thread.start_new_thread(title,())
root.mainloop()
Только в dir(thread) не нашел pthread_join() , чтобы все по-нормальному было :)
shiza
Я не знаю, как там в TK с совместимостью с потоками (т.е. можно ли один интерфейс дергать из разных потоков, как ты пытаешся).
Поэтому предлагаю такой вариант: в основном потоке - GUI, вычисления в воспомогатльном:
from Tkinter import *
import thread,time

root=Tk()
root.title('test')

def count():
time.sleep(2)
print 'jou'

thread.start_new_thread(count,())
root.mainloop()
igor.kaist
gmorgunov не могу найти принципиального отличия твоего варианта кода и моего, так же не работает.
shiza
Поэтому предлагаю такой вариант: в основном потоке - GUI, вычисления в воспомогатльном:
Вообщем так оно и делается обычно, но если нужно передавать резкльтаты вычисления в гуи? Раньше я и не заморачивался с потоками, так как либо временем выполнения задачи можно было пренебречь, либо 2 поток не взаимодействовал с gui
Самое интересное что многие элементы интерфейса прекрасно конфигуются из второга потока, но не все…
Может быть есть у кого решение, не обязательно из области GUI
shiza
Хм. Можно Lock попробовать повесить.
grath_lock = thread.allocate_lock()
grath_lock.acquire()
что-то делаем с графикой
grath_lock.release()
igor.kaist
Спасибо, но не помогло.. Навешал лок на 2 поток…
gmorgunov
igor.kaist
Здравствуйте. Честно говоря не понимаю, что значит “виснет”. Составил 2 примерчика, которые работают в точности
как ваш и ничего не виснет.
from Tkinter import *
import threading,time

root=Tk()
def title():
time.sleep(2)
root.title("test")

test=threading.Thread(target=title)
test.start()
root.mainloop()
Для интереса попробовал на pyqt - ведет точно так же.

from PyQt4 import QtGui
import sys,thread,time

app = QtGui.QApplication(sys.argv) # root=Tk()
root = QtGui.QMainWindow() #

def title():
time.sleep(2)
root.setWindowTitle("test")

thread.start_new_thread(title,())

root.show() # root.mainloop()
sys.exit(app.exec_()) #
P.S. Может я чего не понимаю, тогда извините за дотошность. У меня openSUSE.
gmorgunov
Попробовал на С. Работает, как должна работать( в моем понимании)

#include <stdio.h>
#include <pthread.h>

void * title() { /* def title() */
printf("test_thread\n");
return 0;
}
int main() { /* root=Tk() */
printf("test_process\n");

pthread_t thread;
pthread_create(&thread,NULL,&title,NULL);
pthread_join(thread,NULL);
while(1); /* root.mainloop() */
return 0;
}
Откомпилите gcc thread.c -o thread -lpthread . запустите ./thread
Запускается процесс(гл. поток) , из него поток ну и цикл.
igor.kaist
Хм.. Иногда забываю что на этом форуме желательно говорить что ты сидишь именно под виндой. По ней, окно зависает, не отвечаешь ни на какие действия, при закрытии вылезает ошибка о невозможности заверишить задачу, как если бы в ней было while 1:pass
Вообщем то, выкинул этот титле куда подальше, весь остальной интерфейс работает прекрасно с двумя потоками..
gmorgunov
Спасибо, более/менее понятно( хотя чему тут особо виснуть то? :/ ). Ну ладно , всегда чего-нибудь виснет - жизнь такая :)

Можно еще вопрос жителям форума ?

В примере на интуите http://www.intuit.ru/department/pl/python/11/5.html есть строка кода:
go_b.config(state=NORMAL), quit_b.config(state=NORMAL)
Почему в ней стоит запятая, а не запяточие ? Пробовал запяточие - тот же эффект.

Спасибо заранее.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB