Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 15, 2008 18:04:21

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter и потоки

Имеется интерфейс, написанный на 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 (страшное название модуля :)



Отредактировано (Окт. 15, 2008 18:05:23)

Офлайн

#2 Окт. 15, 2008 23:06:52

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и потоки

Здравствуйте.
Питоном только начал заниматься, но по аналогии с С-потоками по-моему так:

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() , чтобы все по-нормальному было :)



Офлайн

#3 Окт. 16, 2008 00:09:01

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и потоки

Я не знаю, как там в 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()



Отредактировано (Окт. 16, 2008 00:09:24)

Офлайн

#4 Окт. 16, 2008 00:39:13

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter и потоки

gmorgunov не могу найти принципиального отличия твоего варианта кода и моего, так же не работает.

shiza
Поэтому предлагаю такой вариант: в основном потоке - GUI, вычисления в воспомогатльном:
Вообщем так оно и делается обычно, но если нужно передавать резкльтаты вычисления в гуи? Раньше я и не заморачивался с потоками, так как либо временем выполнения задачи можно было пренебречь, либо 2 поток не взаимодействовал с gui
Самое интересное что многие элементы интерфейса прекрасно конфигуются из второга потока, но не все…
Может быть есть у кого решение, не обязательно из области GUI



Офлайн

#5 Окт. 16, 2008 01:34:57

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и потоки

Хм. Можно Lock попробовать повесить.
grath_lock = thread.allocate_lock()
grath_lock.acquire()
что-то делаем с графикой
grath_lock.release()



Отредактировано (Окт. 16, 2008 01:35:11)

Офлайн

#6 Окт. 16, 2008 10:20:42

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter и потоки

Спасибо, но не помогло.. Навешал лок на 2 поток…



Офлайн

#7 Окт. 16, 2008 13:06:02

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и потоки

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.



Офлайн

#8 Окт. 16, 2008 13:32:36

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и потоки

Попробовал на С. Работает, как должна работать( в моем понимании)

#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
Запускается процесс(гл. поток) , из него поток ну и цикл.



Офлайн

#9 Окт. 16, 2008 23:18:17

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter и потоки

Хм.. Иногда забываю что на этом форуме желательно говорить что ты сидишь именно под виндой. По ней, окно зависает, не отвечаешь ни на какие действия, при закрытии вылезает ошибка о невозможности заверишить задачу, как если бы в ней было while 1:pass
Вообщем то, выкинул этот титле куда подальше, весь остальной интерфейс работает прекрасно с двумя потоками..



Офлайн

#10 Окт. 17, 2008 07:27:44

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и потоки

Спасибо, более/менее понятно( хотя чему тут особо виснуть то? :/ ). Ну ладно , всегда чего-нибудь виснет - жизнь такая :)

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

В примере на интуите http://www.intuit.ru/department/pl/python/11/5.html есть строка кода:

go_b.config(state=NORMAL), quit_b.config(state=NORMAL)
Почему в ней стоит запятая, а не запяточие ? Пробовал запяточие - тот же эффект.

Спасибо заранее.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version