Portál AbcLinuxu, 15. července 2025 03:20


Dotaz: pyQT4 a signál

29.6.2007 13:35 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
pyQT4 a signál
Přečteno: 377×
Odpovědět | Admin
Učim se programovat v pyqt, ale mám jeden dotaz. Například mám jednoduché okno s tlačítkem. Při stisku tlačítka se mi spustí fce, která třeba odpočítává 10 sekund a po odpočítání se program vypne. Ovšem během odpočítávání se GUI přestane překreslovat a nejde s ním pracovat. Proto potřebuju radu, jak spustit tuto fci odděleně. Dohledal jsem si něco o použití vláken, ale i s nimi se mě nedaří docílit požadovaného výsledku.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 29.6.2007 13:37 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: pyQT4 a signál
Odpovědět | | Sbalit | Link | Blokovat | Admin
Já v Pythonu nedělám, ale tohle v C++ řeším pomocí QTimer posílajícího signály (nebo QTimer::singleShot(), když jde jen o jeden).
29.6.2007 13:47 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: pyQT4 a signál
A co když bych chtěl v té fci provádět něco jiného, co by zabralo více času, jak bych pak zajistil aby se GUI během provádění funkce překreslovalo?
Luboš Doležel (Doli) avatar 29.6.2007 13:50 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: pyQT4 a signál
Pak buď použít jiné vlákno nebo volat QCoreApplication::processEvents()
29.6.2007 14:15 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: pyQT4 a signál
Bohužel jsem nic o QCoreApplication::processEvents() společně s pythonem nenašel. Ani nic, co by se podobalo. Snad mi poradí nějaký znalý pythonista, přesto dík za radu.
29.6.2007 15:09 hanzz | skóre: 19 | blog: hanzz
Rozbalit Rozbalit vše Re: pyQT4 a signál
Budes se muset naucit vyuzivat dokumentaci k QT4, ktera je psana pro C++. Pro Python dokumentace moc neni, protoze zkusenejsi nemaji problem prebirat dokumentaci z C++ a tak neni motivace neco psat.

Jedna z moznosti jak vyresit tvuj problem ja pouziti vlaken (Threadu), ale to obnasi vetsi znalosti QT :). Ja ve svych aplikacich pouzivam QThread pro vlakna a QMutex spolecne se signaly a sloty mezi vlakny pro synchronizaci vlaken mezi sebou. Podivej se do dokumentace k PyQt na priklad malderbrot.py nebo na dalsi priklady, ktere se zabyvaji thready. Kdyztak bych mohl poslat jednoduchy skript, ktery by mohl poslouzit jako ukazka threadu a signaly mezi nimy v QT4. (ackoliv PyQt4 obsahuje nektere chyby, ktere jsem v tom skriptu musel obejit)
29.6.2007 15:10 hanzz | skóre: 19 | blog: hanzz
Rozbalit Rozbalit vše Re: pyQT4 a signál
Aha.. az ted jsem si precetl, ze uz si vlakna zkousel.. S vlakny to urcite pujde... posli ukazku kodu, jak je pouzivas... :)
29.6.2007 15:49 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: pyQT4 a signál
Já jsem použil ty vlákna, co nabízí python. Zkusím se kouknout na QThread. Dík za nasměrování
29.6.2007 16:05 hanzz | skóre: 19 | blog: hanzz
Rozbalit Rozbalit vše Re: pyQT4 a signál
Tak melo by to fungovat i s normalnimi python vlakny, ale s temi se pak blbe (vlastne nevim, jestli to jde vubec) prenasi signaly mezi vlaknem a hlavni aplikaci :)
29.6.2007 23:59 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
Rozbalit Rozbalit vše Re: pyQT4 a signál
posli ty priklady na www.py.cz pls
USE="-gnome -kde";turris
30.6.2007 08:34 hanzz | skóre: 19 | blog: hanzz
Rozbalit Rozbalit vše Re: pyQT4 a signál
kde tam? :) sorry, ze se ptam tak blbe, ale nejak tam neumim sekci o PyQt4 najit
29.6.2007 16:04 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: pyQT4 a signál
Odpovědět | | Sbalit | Link | Blokovat | Admin
V pythonu používám GTK. Vím, že je ti to k ničemu, ale když už to tu mám ...
#!/usr/bin/python
# -*- coding: utf-8 -*-

import gtk, gobject

class Killme:
    def __init__(self):
        self.button = gtk.ToggleButton()
        self.timeout = None
        self.toggled()
        self.button.connect('toggled', self.toggled)
        self.button.show()
        w = gtk.Window()
        w.add(self.button)
        w.connect('destroy', gtk.main_quit)
        w.show()
        gtk.main()

    def run_timer(self, foo = None):
        self.seconds -= 1
        self.button.set_label(u'Chcípnu za %d sekund' %self.seconds)
        self.timeout = gobject.timeout_add(1000, self.run_timer, None)
        if self.seconds == 0:
            gtk.main_quit()

    def stop_timer(self):
        if self.timeout:
            gobject.source_remove(self.timeout)
        self.button.set_label(u'Zapni odpočítávání')

    def toggled(self, foo = None):
        self.seconds = 10
        if self.button.get_active():
            self.run_timer()
        else:
            self.stop_timer()

k = Killme()
Jinak vláknům, hlavní smyčce událostí, časově náročným funkcím a obnovování GUI se věnuje celá sekce PyGTK FAQ: http://faq.pygtk.org/index.py?req=index
v Qt jistě bude něco podobného ...
29.6.2007 16:20 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: pyQT4 a signál
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zkusil jsem toto(použito z Helloworld z abclinuxu.cz :-D ):
#!/usr/bin/python
from qt import *
import time
import threading
def click():
	v = threading.Thread(target = vlakno)
	v.start()
def vlakno():
	time.sleep(5)
	print "ok"
app=QApplication([])
win=QMainWindow()
win.button=QPushButton(win,"Hello")
win.button.setText("Hello World")
win.show()
app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
app.connect(win.button, SIGNAL("clicked()"),click)
app.exec_loop()
a opravdu se GUI během těch 5-ti vteřin překresluje.
29.6.2007 16:23 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: pyQT4 a signál
Ups, jak vložit kód, aby byl správně naformátovaný?
Luboš Doležel (Doli) avatar 29.6.2007 17:51 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: pyQT4 a signál
Stačí použít tag PRE, pak nejsou zapotřebí ani ty BR. Opravil jsem to.
29.6.2007 18:23 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: pyQT4 a signál
ok, dík

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.