Buttonstyle bei Curserberührung

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Hallo,

ich habe angefangen, mich mit wxPython zu beschäftigen. Als erstes habe ich mir natürlich das Buch der Bücher über wxPython besorgt und bin nun dabei, ein vorhandenes Programm (Tkinter-Oberfläche) mit einer wxPython-Oberfläche zu versehen.
Also nicht wundern, wenn ich in der nächsten Zeit hier ein paar Anfängerfragen stelle :D .

Nun zur ersten Frage:
Ich habe eine Toolbar implementiert und darin mit self.toolbar.AddSimpleTool() Icons platziert. Danach habe ich noch selbst Buttons mit Icons zugefügt.
Bild

Code: Alles auswählen

    def navigateBar(self):
        self.toolbar.AddSeparator()
        prev_bmp = wx.Image('./img/pfeil-l-.gif', wx.BITMAP_TYPE_GIF).ConvertToBitmap()
        next_bmp = wx.Image('./img/pfeil-r-.gif', wx.BITMAP_TYPE_GIF).ConvertToBitmap()
        prevName = buttons.GenBitmapButton(self.toolbar, -1, prev_bmp, 
                                           size=(20, 20), style=wx.BORDER_NONE)
        self.toolbar.AddControl(prevName)
    
        namelabel = wx.StaticText(self.toolbar, -1, label='', 
                                  size=(120, -1), 
                                  style=wx.ALIGN_CENTER | wx.ST_NO_AUTORESIZE)
        self.toolbar.AddControl(namelabel)
        nextName = buttons.GenBitmapButton(self.toolbar, -1, next_bmp, 
                                           size=(20, 20), style=wx.BORDER_NONE)
        self.toolbar.AddControl(nextName)
        self.toolbar.AddSeparator()
        prevMonth = buttons.GenBitmapButton(self.toolbar, -1, prev_bmp, 
                                           size=(20, 20), style=wx.BORDER_NONE)
        self.toolbar.AddControl(prevMonth)
        monthlabel = wx.StaticText(self.toolbar, -1, label='', 
                                  size=(70, -1), 
                                  style=wx.ALIGN_CENTER | wx.ST_NO_AUTORESIZE)
        self.toolbar.AddControl(monthlabel)
        yearlabel = wx.StaticText(self.toolbar, -1, label='', 
                                  size=(30, -1), 
                                  style=wx.ALIGN_CENTER | wx.ST_NO_AUTORESIZE)
        self.toolbar.AddControl(yearlabel)
        nextMonth = buttons.GenBitmapButton(self.toolbar, -1, next_bmp, 
                                           size=(20, 20), style=wx.BORDER_NONE)
        self.toolbar.AddControl(nextMonth)
        
        namelabel.SetLabel('Vorname Name')
        monthlabel.SetLabel('September')
        yearlabel.SetLabel('2008')
Gibt es schon etwas fertiges, damit die "eigenen" Buttons bei einer Mausberührung genau so reagieren wie die "fertigen" Buttons?
D.h., wenn der Curser über die Button geht, sollen die "eigenen" Buttons genau wie die "fertigen" Buttons hervorgehoben und in der Statuszeile soll auch ein kurzer Hilfetext angezeigt werden.

Mawilo
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mawilo hat geschrieben:nicht wundern, wenn ich in der nächsten Zeit hier ein paar Anfängerfragen stelle
Hallo Mawilo!

Also das ist garantiert keine Anfängerfrage. :oops: :K

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Mavilo!

Hier ein paar Gedanken zum Quellcode.

Statt ein Image in ein Bitmap umzuwandeln

Code: Alles auswählen

prev_bmp = wx.Image('./img/pfeil-l-.gif', wx.BITMAP_TYPE_GIF).ConvertToBitmap()
könntest du direkt wx.Bitmap verwenden:

Code: Alles auswählen

prev_bmp = wx.Bitmap('./img/pfeil-l-.gif')
Vielleicht kannst du statt

Code: Alles auswählen

prevName = buttons.GenBitmapButton(
    self.toolbar, -1, prev_bmp, size=(20, 20), style=wx.BORDER_NONE
)
das hier verwenden:

Code: Alles auswählen

prevName = buttons.ThemedGenBitmapButton(
    self.toolbar, -1, prev_bmp, size=(20, 20), style=wx.BORDER_NONE
)
Und vielleicht kannst du dem Button mit

Code: Alles auswählen

prevName.SetHelpText("Hilfetext")
einen Text zur Anzeige in der Statuszeile zuweisen.

Alles ungetestet und nur so aus dem Bauch heraus. Du wirst es selber ausprobieren müssen. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Hallo Gerold,

danke für die Hinweise.
gerold hat geschrieben: Statt ein Image in ein Bitmap umzuwandeln

Code: Alles auswählen

prev_bmp = wx.Image('./img/pfeil-l-.gif', wx.BITMAP_TYPE_GIF).ConvertToBitmap()
könntest du direkt wx.Bitmap verwenden:

Code: Alles auswählen

prev_bmp = wx.Bitmap('./img/pfeil-l-.gif')
Hab ich geändert. Stand so eben nicht im Buch (oder kommt erst noch auf den nächsten Seiten :D)
gerold hat geschrieben: Vielleicht kannst du statt

Code: Alles auswählen

prevName = buttons.GenBitmapButton(
    self.toolbar, -1, prev_bmp, size=(20, 20), style=wx.BORDER_NONE
)
das hier verwenden:

Code: Alles auswählen

prevName = buttons.ThemedGenBitmapButton(
    self.toolbar, -1, prev_bmp, size=(20, 20), style=wx.BORDER_NONE
)
Und vielleicht kannst du dem Button mit

Code: Alles auswählen

prevName.SetHelpText("Hilfetext")
einen Text zur Anzeige in der Statuszeile zuweisen.
Hat leider keinen Erfolg gezeigt. Wenn ich den Buttontyp ändere, wird der Button immer als hervorgehoben angezeigt. Das Setzen des Hilfetextes hat auch keine Auswirkungen.

Mawilo
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Ich versuche es nun, selbst zu implementieren. Allerdings habe ich keine Ahnung, wie ich nachträglich den Style eines Buttons ändern kann.

So geht es leider nicht:

Code: Alles auswählen

 def OnEnterButton(self, event):
        event.widget.SetWindowStyle(wx.BORDER_RAISED)
Gibt es dafür eine Möglichkeit?


Mawilo
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Hallo!

Ich weiß ja nicht, ob es eine Hilfe ist, aber:
in der wxPython-Demo (http://www.wxpython.org/download.php) ist ein Beispiel Namens "ButtonPanel" dabei. Das sieht optisch sehr gut aus. Ein "generic Button" Beispiel habe ich auch gefunden, die verhalten sich aber anders. Natürlich gibt es auch Beispiele, die sich mit "Toolbar" beschäftigen.

Vielleicht ist da was für dich dabei?
Gruß!
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Hallo C4S3,

die Button in der Demo sehen ganz nett aus. Ich werde es einmal probieren. Vielen Dank für den Tipp.

Mawilo
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Irgendwie bekomme ich es noch nicht hin. Bei folgendem Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx
import wx.lib.buttonpanel as bp

class MyFrame(wx.Frame):
    def __init__(self, parent, id=-1, title='ButtonPanel', pos=wx.DefaultPosition,
                size=(800, 600), style=wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent, id, title, pos, size, style)
        mainPanel = wx.Panel(self, -1)
        self.logtext = wx.TextCtrl(mainPanel, -1, '', style=wx.TE_MULTILINE)
        vSizer = wx.BoxSizer(wx.VERTICAL) 
        mainPanel.SetSizer(vSizer) 
        bild = wx.Bitmap('./img/pfeil-l-.gif', wx.BITMAP_TYPE_GIF)
        titleBar = bp.ButtonPanel(mainPanel, -1, 'Ein Test')
        
        btn1 = bp.ButtonInfo(wx.NewId(), bild, text='text')
        self.Bind(wx.EVT_BUTTON, self.OnButton, btn1)
        titleBar.AddButton(btn1)
        
        vSizer.Layout()
    
    def OnButton(self, event=None):
        print 'Button-Event'
  
app = wx.PySimpleApp()
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

File "C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\lib\buttonpanel.py", line 965, in __init__
    if id == wx.ID_ANY:
  File "C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\_gdi.py", line 717, in __eq__
    return _gdi_.Bitmap___eq__(*args, **kwargs)
TypeError: in method 'Bitmap___eq__', expected argument 2 of type 'wxBitmap const *'
Mit der Fehlermeldung kann ich nicht allzuviel anfangen. Wo liegt in dem Beispiel der Fehler?

Mawilo
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

*noch mal nach oben schieb*

sorry, ich bin noch nicht weiter gekommen :(
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich hab mich noch nicht tiefer damit beschäftigt; es fällt aber auf, dass Du schreibst

Code: Alles auswählen

        btn1 = bp.ButtonInfo(wx.NewId(), bild, text='text')
,in der Demo heißt es aber

Code: Alles auswählen

            btn = bp.ButtonInfo(self.titleBar, wx.NewId(),
                                png[0], kind=kind,
                                shortHelp=shortHelp, longHelp=longHelp)
Vor wx.NewId() fehlt also noch etwas, deshalb steht als Argument 2 keine Bitmap, sondern ein String.
MfG
HWK
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Ist natürlich wahr :oops:

ich habe das Beispiel abgeändert:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx
import wx.lib.buttonpanel as bp

class MyFrame(wx.Frame):
    def __init__(self, parent, id=-1, title='ButtonPanel', pos=wx.DefaultPosition,
                size=(800, 600), style=wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent, id, title, pos, size, style)
        mainPanel = wx.Panel(self, -1)
        vSizer = wx.BoxSizer(wx.VERTICAL) 
        mainPanel.SetSizer(vSizer) 
        bild = wx.Bitmap('./img/pfeil-l-.gif', wx.BITMAP_TYPE_GIF)
        titleBar = bp.ButtonPanel(mainPanel, -1, 'Ein Test')
        btn1 = bp.ButtonInfo(titleBar, wx.NewId(), bild, text='text')
        self.Bind(wx.EVT_BUTTON, self.OnButton, btn1)
        titleBar.AddButton(btn1)
        vSizer.Layout()
    
    def OnButton(self, event=None):
        print 'Button-Event'
  
app = wx.PySimpleApp()
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
Leider wird aber kein Button angezeigt. :(
Antworten