Portál AbcLinuxu, 17. července 2025 06:22


Dotaz: python pygtk nejde deiconify pri pouziti threading

17.10.2013 20:07 adrinko | skóre: 22
python pygtk nejde deiconify pri pouziti threading
Přečteno: 202×
Odpovědět | Admin
Ahojte, mam tento kod, ale co je zaujimave, ked pouzivan threading modul tak v topko mi neviem preco nezobrazi okno po zavolani tejto funkcie topko(tam je deiconify, show) Mohli by ste mi prosim poradit ako to napravit?
# -*- coding: utf-8 -*-
import sys       
import traceback  
import os 
import threading
import psutil 

def we_are_frozen():
  return hasattr(sys, "frozen")

def module_path():
  encoding = sys.getfilesystemencoding()
  if we_are_frozen():
    return os.path.dirname(unicode(sys.executable, encoding))
  return os.path.dirname(unicode(__file__, encoding))
  
os.environ['LANGUAGE'] = "en" 
import elib.intl                 
import pygtk
pygtk.require("2.0")
import gtk
import gobject
import urllib2
import datetime
import time, platform
from _winreg import *
import warnings 
warnings.simplefilter('ignore', Warning)


def hooo(err, ret=None, error=''): 
  print traceback.format_exc()
  print err
  while gtk.events_pending():
    gtk.main_iteration()
  gtk.gdk.flush()
  topko()
  topko()

def topko(): 
  app.okno.deiconify()
  gdkwin = app.okno.window
  gdkwin.set_keep_above(True) 
  gdkwin.set_keep_above(False)
  gdkwin.show()  

class jj:
    def __init__(self):

        local_path=os.path.join(module_path(), "lg")   
        elib.intl.install('translation', local_path)     
        self.okno = gtk.Window(gtk.WINDOW_TOPLEVEL) 
        self.okno.iconify()
        self.okno.resize(400,50)
        self.okno.show_all()
                                   
        #self.xx()

    def play(self):
        threading.Thread(target=self.xx).start()
    
    def xx(self):
      db="a.s"
      if os.path.isfile(db.decode('utf8').replace('\\','/')) == False: 
        hooo('5','')  
        return False  

if __name__ == "__main__":
    gtk.threads_init()
    app = jj()
    app.play()
    
    gtk.threads_enter() 
    gtk.main()
    gtk.threads_leave() 
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.10.2013 21:14 potato
Rozbalit Rozbalit vše Re: python pygtk nejde deiconify pri pouziti threading
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud správně čtu, jak to probíhá, tak nejen voláš z vedlejšího threadu GUI funkce, což není obecně podporováno, ale dokonce se z něj pokoušíš ručně iterovat Gtk+ main loop, což už nemůže fungovat vůbec. Standardní postup: v jednom vláknu běží Gtk+ main loop; ostatní, když potřebují něco poslat do GUI, používají g_idle_add() a podobné funkce.
17.10.2013 21:23 adrinko | skóre: 22
Rozbalit Rozbalit vše Re: python pygtk nejde deiconify pri pouziti threading
priznám sa, moc s tým nemám skúsenosti, ale aspoň mi to zaručí, že okno "nezamrzne", pokiaľ funkcia beží dlho (spracováva dáta z db). no ale teraz k veci - našla by sa nejaká rada, ako by som následne v topko donútil okno vystúpiť do popredia a zobraziť ho?
17.10.2013 21:51 potato
Rozbalit Rozbalit vše Re: python pygtk nejde deiconify pri pouziti threading
Že ti okno nezamrzne, pokud funkce běží dlouho, má zajišťovat to, že ta věc, co běží dlouho, běží parallelně v jiném vlákně než GUI -- což tedy v CPythonu zatím reálně nejde, protože interpret používá globální zámek, takže se všechno vykonává sériově. Další možnost je použít modul multiprocessing a spouštět to v jiném procesu. Nebo tu dlouho běžící věc vykonávat po malých kouscích uvnitř main loop (nikoli vně).

Na deikonifikaci, zobrazení a posunutí na popředí normálně slouží metoda Window.present().

Ale pokud ti nefunguje, protože nějak svérázně zasahuješ do vykonávání main loop, tak je rada don't do it then...
17.10.2013 22:46 adrinko | skóre: 22
Rozbalit Rozbalit vše Re: python pygtk nejde deiconify pri pouziti threading
vďaka za teóriu, osobne by mi ale dosť pomohol názorný príklad. nie som z toho moc múdry.. teda ako by som to mal zmeniť, aby to zároveň nezamrzlo a zároveň fungovala aj deikonifikácia.

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.