Toon posts:

[Python] Gebruik van variabelen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben onlangs (gisteren) mij in Python gaan verdiepen, nu loop ik tegen het volgende aan;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class WX_Main(wx.App):
  
   def OnInit(self):
       window = wx.Frame(None)
       window.SetTitle("Video-Player")
       playstate = 0
       self.Bind(wx.EVT_LEFT_DOWN, self.start_stop)
       self.movie_window = wx.Panel(window)
       vbox.Add(self.movie_window,1,wx.ALL|wx.EXPAND,4)
       window.SetSizer(vbox)
       window.Layout()
       window.ShowFullScreen(True, style=wx.FULLSCREEN_ALL)
       window.Show()
       self.SetTopWindow(window)
      
       self.player = gst.element_factory_make("playbin", "player")
       bus = self.player.get_bus()
       bus.add_signal_watch()
       bus.enable_sync_message_emission()
       bus.connect('message', self.on_message)
       bus.connect('sync-message::element', self.on_sync_message)
      
       return True
      
   def start_stop(self, event):
       if playstate == 0:
           filepath = "/home/bart/video/seven.avi"
           if os.path.exists(filepath):
               playstate = 1
               self.player.set_property('uri',"file://" + filepath)
               self.player.set_state(gst.STATE_PLAYING)
       else:
           self.player.set_state(gst.STATE_NULL)
           playstate=0

etc...


Ik ben nog vrij onbekend met het gebruik van variabelen in python. Wat ik wil doen is om de variabele playstate op nul te laten staan zodra er niks aan het spelen is of de film is stopgezet anderzijds zal die dus op 1 staat wanneer er een film aan het spelen is. Zoals de code nu opgebouwd is lukt dit niet;

Traceback (most recent call last):
File "video", line 49, in start_stop
if playstate == 0:
NameError: global name 'playstate' is not defined


Ik heb wat rondgegoogled over het gebruik van variabelen maar kan hier moeilijk duidelijkheid over krijgen. Volgens mij is het gebruik van een global variabele een oplossing alleen zie ik hier en daar dat die afgeraden wordt in python en dat hier een andere oplossing voor zou moeten zijn die mij echter onduidelijk is.

Hulp is van harte welkom! thx

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nu ben ik geen Python kenner, maar wat jij zoekt is de scope van variabelen (of je moet 'm als parameter meegeven aan start_stop o.i.d.) ;)

Globals zijn, in de talen die ik wél ken :P, meestal (niet altijd!) geen goed idee inderdaad. Of dat in Python ook zo is weet jij waarschijnlijk beter dan ik :P

[ Voor 78% gewijzigd door RobIII op 12-02-2009 19:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • user109731
  • Registratie: Maart 2004
  • Niet online
playstate is een lokale variabele in OnInit, die kun je in start_stop niet zomaar uitlezen. Wat je kunt doen is er een member-variabele van maken door er overal "self." voor te zetten, dan is die in alle methods van WX_Main te benaderen :)

Globals worden ook in Python (in dit geval iig) afgeraden :p

[ Voor 7% gewijzigd door user109731 op 12-02-2009 19:32 ]


Verwijderd

Topicstarter
@Jan: Het werkt, bedankt!

@Rob: ik ga me eens verdiepen in de scope van de variabelen

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik kom me hier toch wederom met een vraag melden _/-\o_

Wat ik nu graag klaar zou willen spelen is om variabelen tussen twee verschillende classes te delen.

Na google weer eens geraadpleegd te hebben blijkt dat inderdaad het niet verstandig is om een global variabele te gebruiken. Ik kom hier en daar tegen dat ik een class zou moeten aanmaken die alle variabele vasthoudt. En dan vervolgens een ´instance´ van die class te maken? Dit is mij echter onduidelijk, zou iemand hiervan een voorbeeld willen geven?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class LeftPanel(wx.Panel):
    colours = ["Grey", "Red", "Blue"]
    thicknesses = [1, 2, 3, 4, 5, 6, 7]

    def __init__(self, parent, id):

        wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN)
    
    self.initDrawing()
    self.makeMenu()
        self.bindEvents()
        self.initBuffer()

-- snip --
    def initDrawing(self):
        self.SetBackgroundColour('WHITE')
        self.currentThickness = self.thicknesses[4]
        self.currentColour = "Red" 
        self.lines = []
        self.previousPosition = (0, 0)

class RightPanel(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN)
        groenknop = wx.BitmapButton(self, -1, wx.Bitmap('icons/groen.png'),style=wx.NO_BORDER)
    self.Bind(wx.EVT_BUTTON, self.OnGroen,id=groenknop.GetId())

    def OnGroen(self, event):
        self.currentColour = "Groen"


Wat ik met het stukje code wil bereiken is dat wanneer ik op een button van het rechterpanel klik de variabele currentColour verandert naar "Groen".

Bvd!

ps. kan iemand mij een goed boek over Python aanraden waarin liefst met duidelijk voorbeelden gewerkt wordt en dat ook als referentiehandleiding geraadpleegt kan worden?

Acties:
  • 0 Henk 'm!

  • colbrac
  • Registratie: Februari 2003
  • Niet online
Ok E-book: http://www.diveintopython.org/

Verder vond ik Core Python programming 2nd edition ook erg goed.


een instance van een class is wanneer je de class aanroept en dat kan meer dan 1 keer. Bijvoorbeeld:

paneel1 = LeftPanel(parentvar, idvar)
paneel2 = LeftPanel(parentvar_alt, idvar_alt)

Nu heb ik twee instances van de class LeftPanel. Ze zijn helemaal onafhankelijk van elkaar, als in de een een variabele wordt veranderd merkt de andere instance daar niets van etc. Wat ze delen is de set van standaardwaardes en methods zoals die in de class LeftPanel gedefineerd zijn.

Edit: Beter lezen van je wat precies vraagt. Wat jij nu doet met 2x self.currentColour werkt dus niet. Wat je kan doen is de instance van de LeftPanel class (paneel1 dus bijvoorbeeld) meegeven als optie wanneer je een RightPanel instancieert (is dat een woord??).

Dus in de class RightPanel wordt de init iets als "def __init__(self, parent, id, leftpanel):", in de __init__ maak je dan een locale variabele van de leftpanel dus "self.leftpanel = leftpanel" en in de method OnGroen verander je dan de kleur in self.leftpanel.currentColour

[ Voor 31% gewijzigd door colbrac op 13-02-2009 21:00 ]


Acties:
  • 0 Henk 'm!

  • phobosdeimos
  • Registratie: Augustus 2007
  • Laatst online: 22:22
Deze materie heeft op zich weinig met python te maken, eerder met de beginselen van programmeren en OO theorie.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt, het is gelukt. Ik zal me eens in het e-boek gaan verdiepen!
Pagina: 1