[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