LED benutzen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Begin
User
Beiträge: 17
Registriert: Donnerstag 26. Mai 2011, 09:32

Hallo,

gibt es in wxpython LED's zu benutzen ?
Habe mir selber welche erstellt, aber das sind Bitmaps.
Also bei Veränderung der Bildschirmgröße bleiben diese gleich.
Gibt es da was ?
Hab jetzt schon ein bischen gesucht aber nur so Digital gefunden und bräuchte sie als Statusmeldung rot oder grün und blinkend.
Wenn es da was gibt wäre super.

Danke
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

Also ohne da jetzt viel drueber zu wissen, habe ich nur mal kurz aus interesse gegoogelt. Kennst du die folgenden links schon?

Link 1

Link 2
Begin
User
Beiträge: 17
Registriert: Donnerstag 26. Mai 2011, 09:32

Erstmal Danke für die Antwort.
Die zwei Links habe ich auch gefunden.
Problem ist nur wenn ich die Bildschirmauflösung ändere, dann versetzt sich das ganze.
Dachte es gibt schon für python so eine LED. Wie bei einem PC wenn er hochfährt und die LED leuchtet.
Was anderes ?
Ich habe in wx.python eine Oberfläche erstellt, aber irgendwie kann ich die Buttons nicht mehr drücken. Ich habe keine Ahnung warum.

Code: Alles auswählen

class MyFrame(wx.Frame):
#"""make a frame, inherits wx.Frame"""
    def __init__(self,parent,id,title):
        # create a frame, no parent, default to wxID_ANY
        wx.Frame.__init__(self, parent, id, title, pos=(0, 0),             size=wx.DisplaySize(),style=wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | wx.RESIZE_BOX | wx.MAXIMIZE_BOX))

        self.SetAutoLayout(True)
        
        self.panelE = wx.Window(self, -1, style=wx.SIMPLE_BORDER)
        self.panelE.SetBackgroundColour(wx.WHITE)
        self.panelE.SetConstraints(
            layoutf.Layoutf('t=t#1;r=r#1;b=b#1;l=l#1', (self,)))
        self.button = wx.Button(self, 1000, "Start")
        self.button.SetPosition((100, 50))
        self.button.SetForegroundColour(wx.Color(255,0,0))
        self.button.SetBackgroundColour(wx.BLUE)
        self.button.SetSize(wx.Size(150,50))
        self.button.Bind(wx.EVT_BUTTON, self.buttonClick)
        self.button.SetToolTip(wx.ToolTip("Starte Programm"))     
def buttonClick habe ich jetzt nicht aufgezeigt
Vielleicht weiß wer was das Problem ist.
Die Buttons werden anzeigt zeigen aber keine Funktion

Danke
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Du ordnest dein Event nicht richtig zu. Du musst das Event an etwas in der Hierarchie höher gelegenes "binden". In deinem Fall bindest du es an das Button selbst dass das Event auslösen soll. Du musst es an "self.panelE" binden.

Also:

Code: Alles auswählen

...
self.panelE.Bind(wx.EVT_BUTTON, self.buttonClick, self.button)
....
(Beachte das "self.button" am Ende!)

Allerdings erkläre doch bitte mal, warum du ein wx.Window in einem wx.Window erstellst? Normalerweise packt man ein wx.Panel in ein wx.Window. ;)
Möglicherweise kommt daher auch der Fehler bei geänderter Auflösung bzw. Größe.
Begin
User
Beiträge: 17
Registriert: Donnerstag 26. Mai 2011, 09:32

Danke für deine Antwort.
Leider hat sich an meinen Problem nichts geändert.
Ich habe es jetzt an den panel gebunden.
UNd das wx.Window durch wx.panel ersetztz, aber der Fehler ist trotzdem noch.
Mir kommt es so vor al wäre der Button statisch. Beim klicken müsste er sich eigentlich bewegen, dass macht er aber nicht unabhängig vom bind.
Danke
Begin
User
Beiträge: 17
Registriert: Donnerstag 26. Mai 2011, 09:32

Jetzt hab ich schon mal was herausgefunden:

Code: Alles auswählen

        self.panelE = wx.Panel(self, 1)#, style=wx.SIMPLE_BORDER)
        self.panelE.SetBackgroundColour(wx.WHITE)
        self.panelE.SetConstraints(
            layoutf.Layoutf('t=t#1;r=r#1;b=b#1;l=l#1', (self,)))
        
        self.panelA = wx.Panel(self,2 )#, style=wx.SIMPLE_BORDER)
        self.panelA.SetBackgroundColour(wx.BLACK)
        self.panelA.SetConstraints(
            layoutf.Layoutf('t=t#1;l=l#1;b=b#1;r%r10#1',(self,))

        self.button = wx.Button(self.panelE, 1000, 'Start')
        self.button.SetPosition((150, 200))
        self.button.SetForegroundColour(wx.Color(255,0,0))
        self.button.SetBackgroundColour(wx.BLUE)
        self.button.SetSize(wx.Size(150,50))
        #self.panelB.Bind(wx.EVT_BUTTON, self.buttonClick,self.button)
        self.button.SetToolTip(wx.ToolTip("Starte Programm"))     
            )
Wenn ich den button panelE binde funktioniert es, aber wenn ich ihn an panelA binde geht der button nicht.
Warum ?
Achja damit das Thema mit der LED nicht verschiwindet, weiß also keiner was
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Wie gesagt, du musst die Hierarchie beachten. Du kannst dir das ungefähr so vorstellen: (Ausgehend von deinem letzten Beispiel)

Code: Alles auswählen

MyFrame (wx.Frame)
|
|____panelE (wx.Panel)
|
|____panelA (wx.Panel)
Wenn du nun dein Button erstellst...

Code: Alles auswählen

self.button = wx.Button(self.panelE, 1000, 'Start')
...dann sieht die Hierarchie folgendermaßen aus:

Code: Alles auswählen

MyFrame (wx.Frame)
|
|____panelE (wx.Panel)
|    |
|    |_____button (wx.Button)
|
|____panelA (wx.Panel)
Wenn du nun dein Event an "panelA" bindest, kann es nichts damit anfangen, weil es kein Objekt mit der Id "1000" kennt. Das tut nur "panelE". Wenn du hingegen das Event an "MyFrame" bindest, ist es unwichtig welchem Panel das Button zugeordnet wurde, denn das Frame steht in der Hierarchie über beiden Panels. Bist du mitgekommen? :)

Und wenn ich dir den Tipp geben darf, versuch erst gar nicht (ohne wirklich wichtigen und gut überlegten Grund) die Ids der Objekte selbst zu handhaben. Wenn du ein Objekt erstellst welches eine Id erwartet, gib entweder -1 an, oder wenn du anderweitig die Id benötigst, erstell dir mit wx.NewId() eine.

Zu deinem LED Problem kann ich so ohne Code nichts sagen.


PS: Wenn du etwas mehr über die Hintergründe der Objekt-Hierarchie erfahren möchtest, dann kann ich dir nur das hier empfehlen: http://wiki.wxpython.org/Widget%20Inspection%20Tool
BlackJack

Anstelle der -1 würde ich `wx.ID_ANY` nehmen. Dann weiss der Leser auch was das Argument bedeutet.
Begin
User
Beiträge: 17
Registriert: Donnerstag 26. Mai 2011, 09:32

Vielen Dank. Habs jetzt hinbekommen.
Da es mit den LED nicht gibt werde ich Sie selbst zeichnen.
Dann tritt aber das nächste Problem auf!
Wenn ich bei einem großen Bildschirm alles einstelle und dann das ganze an einen kleineren anschliesse wandert mein Bild.
Gibt da irgendwelche Beispiele wie ich das Bild immer auf der gleichen Position halten kann.

Vielen Dank
Begin
User
Beiträge: 17
Registriert: Donnerstag 26. Mai 2011, 09:32

Hallo,

ich habe jetzt die LED erstellt. Einzeln würde es gehen aber wenn ich es in meinen Code einbinde leider nicht mehr. Da sich die Grafik aufhängt.
LED Code

Code: Alles auswählen

def change_intensity(color, fac):
    rgb = [color.Red(), color.Green(), color.Blue()]
    for i, intensity in enumerate(rgb):
        rgb[i] = min(int(round(intensity*fac, 0)), 255)
        
    return wx.Color(*rgb)    

class LED(wx.Control):
    def __init__(self, parent, id=-1, colors=[wx.Colour(220, 10, 10), wx.Colour(250, 200, 0), wx.Colour(10, 220, 10),wx.Colour(240,240,240)],
                 pos=(-1,-1), style=wx.NO_BORDER):
        size = (500, 500)
        wx.Control.__init__(self, parent, id, pos, size, style)
        self.MinSize = size
        
        self._colors = colors
        self._state = -1
        self.SetState(0)
        self.Bind(wx.EVT_PAINT, self.OnPaint, self)
        
        
    def SetState(self, i):
        if i < 0:
            raise ValueError, 'Cannot have a negative state value.'
        elif i >= len(self._colors):
            raise IndexError, 'There is no state with an index of %d.' % i
        elif i == self._state:
            return
        
        self._state = i
        base_color = self._colors[i]
        light_color = change_intensity(base_color, 1.15)
        shadow_color = change_intensity(base_color, 1.07)
        highlight_color = change_intensity(base_color, 1.25)
        
        ascii_led = '''
        
        000000-----00000000      
        0000---------000000
        000-----------00000
        00-----XXX----=0000
        0----XX**XXX-===000
        0---X***XXXXX===000
        ----X**XXXXXX====00
        ---X**XXXXXXXX===00
        ---XXXXXXXXXXX===00
        ---XXXXXXXXXXX===00
        ----XXXXXXXXX====00
        0---XXXXXXXXX===000
        0---=XXXXXXX====000
        00=====XXX=====0000
        000===========00000
        0000=========000000
        000000=====00000000
        0000000000000000000
    
        '''.strip()
        
        xpm = ['19 30 5 1', # width height ncolors chars_per_pixel
               '0 c None', 
               'X c %s' % base_color.GetAsString(wx.C2S_HTML_SYNTAX).encode('ascii'),
               '- c %s' % light_color.GetAsString(wx.C2S_HTML_SYNTAX).encode('ascii'),
               '= c %s' % shadow_color.GetAsString(wx.C2S_HTML_SYNTAX).encode('ascii'),
               '* c %s' % highlight_color.GetAsString(wx.C2S_HTML_SYNTAX).encode('ascii')]
        
        xpm += [s.strip() for s in ascii_led.splitlines()]
        
        self.bmp = wx.BitmapFromXPMData(xpm)
        
        self.Refresh()
        
    def GetState(self):
        return self._state
    
    State = property(GetState, SetState)
    
    def OnPaint(self, e):
        dc = wx.PaintDC(self)
        dc.DrawBitmap(self.bmp, 0, 0, True)
Dann habe ich meine Grafische Oberfläche(ein Auschnitt):

Code: Alles auswählen

class MyFrame(wx.Frame):
    #"""make a frame, inherits wx.Frame"""
    def __init__(self,parent,id,title):
        # create a frame, no parent, default to wxID_ANY
        wx.Frame.__init__(self, parent, id, title, pos=(0, 0), size=wx.DisplaySize(),style=wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER |                         wx.RESIZE_BOX | wx.MAXIMIZE_BOX))
self.panelD = wx.Panel(self.panelE, -1)#, style=wx.SIMPLE_BORDER)
self.panelD.SetBackgroundColour(wx.Colour(146,178,193))
self.panelD.SetConstraints(
layoutf.Layoutf('t_t#3;r=r#1;b%b70#1;l>1#2', (self,self.panelC,self.panelF))
)

self.LED6(3)

def LED6(self, farbe):

l6 = LED(self.panelD)
lcd_work = l6
lcd_work.SetState(farbe)
posi22 = self.pos(150, 410)
l6.Position=posi22
self.Show()[/code]
Wenn ich jetzt mit einem Modul in die def LED6() der Grafischen Oberfläche gehe.
hängt sich das ganze auf.

modul Auschnitt:

Code: Alles auswählen

class ThreadDatei(threading.Thread):
    
##################Thread Variable Zuweisung#####################
######################################################################
    
    def __init__(self,parent1):
        self.parent1 = parent1
def run (self):
while True:
time.sleep(2)
self.parent1.LED6(1)
[/code]

Oder wie könnte ich das ganze realisieren ?
Damit ich die LED ansteuern kann die auf der Grafische Oberfläche ist

VG
Antworten