Форум сайта python.su
Имеется интерфейс, написанный на Tkinter (не уговаривайте использовать другую библиотеку),
так же имеется отдельный поток, который занимается своим очень важным делом :)… Примерно так:
from Tkinter import *
import thread,time
root=Tk()
def title():
time.sleep(2)
root.title('test')
thread.start_new_thread(title,())
root.mainloop()
Отредактировано (Окт. 15, 2008 18:05:23)
Офлайн
Здравствуйте.
Питоном только начал заниматься, но по аналогии с С-потоками по-моему так:
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()
Офлайн
Я не знаю, как там в 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)
Офлайн
gmorgunov не могу найти принципиального отличия твоего варианта кода и моего, так же не работает.
shizaВообщем так оно и делается обычно, но если нужно передавать резкльтаты вычисления в гуи? Раньше я и не заморачивался с потоками, так как либо временем выполнения задачи можно было пренебречь, либо 2 поток не взаимодействовал с gui
Поэтому предлагаю такой вариант: в основном потоке - GUI, вычисления в воспомогатльном:
Офлайн
Хм. Можно Lock попробовать повесить.
grath_lock = thread.allocate_lock()
grath_lock.acquire()
что-то делаем с графикой
grath_lock.release()
Отредактировано (Окт. 16, 2008 01:35:11)
Офлайн
Спасибо, но не помогло.. Навешал лок на 2 поток…
Офлайн
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()
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_()) #
Офлайн
Попробовал на С. Работает, как должна работать( в моем понимании)
#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;
}
Офлайн
Хм.. Иногда забываю что на этом форуме желательно говорить что ты сидишь именно под виндой. По ней, окно зависает, не отвечаешь ни на какие действия, при закрытии вылезает ошибка о невозможности заверишить задачу, как если бы в ней было while 1:pass
Вообщем то, выкинул этот титле куда подальше, весь остальной интерфейс работает прекрасно с двумя потоками..
Офлайн
Спасибо, более/менее понятно( хотя чему тут особо виснуть то? :/ ). Ну ладно , всегда чего-нибудь виснет - жизнь такая :)
Можно еще вопрос жителям форума ?
В примере на интуите http://www.intuit.ru/department/pl/python/11/5.html есть строка кода:
go_b.config(state=NORMAL), quit_b.config(state=NORMAL)
Офлайн