[python] ShowModal ve WxPythonu

Petr Nesládek petr.nesladek na seznam.cz
Pátek Srpen 31 18:19:02 CEST 2007


> ------------ Původní zpráva ------------
> Od: Jakub Vojacek <jakohv na seznam.cz>
> Předmět: [python] ShowModal ve WxPythonu
> Datum: 30.8.2007 22:42:56
> ----------------------------------------
> Zdravím
> 
> Potřeboval bych pomoci najít ve Wx něco jako grab_set() v Tkinteru (nové okno je
> aktivní a na předchozí se nedá kliknout dokud se nové nezavře). Mohl bych použít
> ShowModal, ale to se mi zastaví celá aplikace. 
> 
> Přikládám kód. Potřebuju, aby se nedali začít dva výpočty najednou (jinak dojde
> k vygenerování vyjímky):
> # -*- coding: cp1250 -*-
> import wx
> def compute(seznam):
>     while seznam[0]:
>         wx.Yield()
>         print "probiha vypocet"
> class Okno:
>     def __init__(self):
>         self.okno=wx.Frame(None)
>         button=wx.Button(self.okno,label="Spusť")
>         button.Bind(wx.EVT_BUTTON, self.pocitej)
>         self.okno.Show(1)
>         self.vypocet=[True]
>     def pocitej(self,akce):
>         self.vypocet[0]=True
>         self.cancel()
>         compute(self.vypocet)
>         self.znic_okno()
>     def stop(self,akce):
>         self.vypocet[0]=False
>     def prerusit(self):
>         try:
>             self.okno2.Destroy()
>         except:pass
>         self.vypocet[0]=False
>     def cancel(self):
>        
> self.okno2=wx.Frame(self.okno,size=(150,100),style=wx.FRAME_NO_TASKBAR|wx.FRAME_FLOAT_ON_PARENT|wx.CAPTION)
>         self.okno2.SetBackgroundColour((236, 233, 216))
>         self.okno2.Centre()
>         button=wx.Button(self.okno2,label="Přerušit")
>         button.Bind(wx.EVT_BUTTON,lambda e:self.prerusit())
>         self.okno2.Show()
>     def znic_okno(self):
>         try:
>             self.okno2.Destroy()
>         except:
>             pass
> ap = wx.App(0)
> Okno()
> ap.MainLoop()
> 
> 
> Díky moc za pomoc!
> 
> Blujacker
> 

Taky s wx začínám, ale problém je púodle mě v tom, že
se neda za ShowModal ještě spustit výpočet - zastaví se na tom - grafické porstředí běží, ale daná metoda tam zůstane stát a to samé způsobí takhle postavená funkce výpočtu. řešení je podle mě ve více vláknech  -? a nebo jednoduchou úpravou  - coby "semafor", ketrý nedovolí podruhé spustit metodu pocitej :

Tj začátek metody __init__ a počítej by vypydaly takto :

class Okno:
    def __init__(self):
        self.okno=wx.Frame(None)
        button=wx.Button(self.okno,label="Spusť")
        button.Bind(wx.EVT_BUTTON, self.pocitej)
        self.okno.Show(1)
        #tady musí být zastavený na počátku
        self.vypocet=[False]
        
    def pocitej(self,akce):
        if self.vypocet[0] == True :
            return
        else:
            self.vypocet[0]=True
            self.cancel()
            compute(self.vypocet)
            self.znic_okno()


vše ostatní ponechám a chodí to -doufám dle představy, ale asi to úplně nějlepší cesta není, ale je poměrně jednoduchá a funkční


Petr


Další informace o konferenci Python