Seite 1 von 1

Buttonstyle bei Curserberührung

Verfasst: Montag 17. September 2007, 20:48
von Mawilo
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

Re: Buttonstyle bei Curserberührung

Verfasst: Montag 17. September 2007, 21:05
von gerold
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
:-)

Verfasst: Montag 17. September 2007, 21:15
von gerold
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
:-)

Verfasst: Montag 17. September 2007, 21:38
von Mawilo
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

Verfasst: Dienstag 18. September 2007, 16:03
von Mawilo
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

Verfasst: Donnerstag 20. September 2007, 15:19
von C4S3
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?

Verfasst: Samstag 22. September 2007, 07:27
von Mawilo
Hallo C4S3,

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

Mawilo

Verfasst: Sonntag 30. September 2007, 11:19
von Mawilo
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

Verfasst: Mittwoch 10. Oktober 2007, 13:35
von Mawilo
*noch mal nach oben schieb*

sorry, ich bin noch nicht weiter gekommen :(

Verfasst: Mittwoch 10. Oktober 2007, 14:08
von HWK
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

Verfasst: Mittwoch 10. Oktober 2007, 17:07
von Mawilo
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. :(