Fett gedruckter Menü-Eintrag

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 8. März 2007, 15:15

Man sieht ja immer wieder Menüs, die fett gedruckte Einträge enthalten, z.B. Schließen im Taskbar bei Windows. Gibt es in wxPython eine Möglichkeit, das zu erreichen?
Danke
HWK
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Donnerstag 8. März 2007, 15:19

Hi.

Habs noch nicht gesteste, aber vielleicht Funktioniert ja SetFont. Könntest dir ein Font zusammenbasteln das bolded ist, und den ``wxMenuItem`` dieses Font übergeben.

EDIT: Ups, leider nur Windows only.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 8. März 2007, 16:49

Ja, stimmt! Manchmal sieht man den Wald vor lauter Bäumen nicht. 'Windows only' reicht mir.
Danke
HWK
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 8. März 2007, 20:56

So, ich hab's jetzt mal probiert. Zum einen muss man erst das MenuItem mit dem entsprechenden Font erstellen, bevor man es zum Menü hinzufügt, damit die Änderung sichtbar wird. Zum anderen sind die Einträge ab dem geänderten Font alle um ein Zeichen nach rechts verschoben. Das zweite ist schon etwas störend. Gibt's dafür eine Erklärung bzw. besser eine Lösung?

Code: Alles auswählen

import  wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Playing with menus', size=(400, 200))
        self.CenterOnScreen()
        tc = wx.TextCtrl(self, -1, '''Probetext''',
                         style=wx.TE_READONLY|wx.TE_MULTILINE)
        menuBar = wx.MenuBar()
        menu1 = wx.Menu()
        menu1.Append(101, '&Mercury')
        menu1.Append(102, '&Venus')
        item = wx.MenuItem(menu1, 103, '&Erde')
        font = item.GetFont()
        font.SetWeight(wx.FONTWEIGHT_BOLD)
        font = wx.Font(font.GetPointSize(), font.GetFamily(), font.GetStyle(),
                       font.GetWeight())
        item.SetFont(font)
        menu1.AppendItem(item) 
        menu1.AppendSeparator()
        menu1.Append(104, '&Close')
        menuBar.Append(menu1, '&Planets')
        self.SetMenuBar(menuBar)
        self.Bind(wx.EVT_MENU, self.Menu101, id=101)
        self.Bind(wx.EVT_MENU, self.Menu102, id=102)
        self.Bind(wx.EVT_MENU, self.Menu103, id=103)
        self.Bind(wx.EVT_MENU, self.CloseWindow, id=104)

    def Menu101(self, event):
        print 'Merkur'

    def Menu102(self, event):
        print 'Venus'

    def Menu103(self, event):
        print 'Erde'

    def CloseWindow(self, event):
        self.Close()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()
[Edit] Ich hab's jetzt erst mal notdürftig gelöst, indem ich auch dem ersten Eintrag einen neuen (allerdings unveränderten) Font zugewiesen habe. Dann stimmt die Ausrichtung. Wenn man dann aber Bitmaps zufügt, kommt alles wieder durcheinander. Scheint ein bisschen chaotisch implementiert zu sein.
MfG
HWK
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 8. März 2007, 21:40

HWK hat geschrieben:Zum anderen sind die Einträge ab dem geänderten Font alle um ein Zeichen nach rechts verschoben.
Hi HWK!

Das war meine Gegenprobe:

Code: Alles auswählen

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

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, id = -1, title = "Example", size = wx.Size(550, 420)
    ):
        
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        # Menubar
        menubar = wx.MenuBar()
        
        # File-Menu
        mnu_file = wx.Menu()
        
        mnu_f_new = mnu_file.Append(-1, "&New\tCTRL+N")
        self.Bind(wx.EVT_MENU, self.new_file, mnu_f_new)
        
        mnu_f_open = wx.MenuItem(mnu_file, text = "&Open\tCTRL+O")
        font = mnu_f_open.GetFont()
        font.SetWeight(wx.BOLD)
        mnu_f_open.SetFont(font)
        mnu_file.AppendItem(mnu_f_open)
        self.Bind(wx.EVT_MENU, self.open_file, mnu_f_open)
        
        mnu_f_exit = mnu_file.Append(-1, "E&xit")
        self.Bind(wx.EVT_MENU, self.close_frame, mnu_f_exit)
        
        menubar.Append(mnu_file, "&File")
        
        # Activate Menubar
        self.SetMenuBar(menubar)
    
    
    def close_frame(self, event = None):
        
        self.Close()
    
    
    def open_file(self, event = None):
        
        print "Open file..."
    
    
    def new_file(self, event = None):
        
        print "New file..."


def main():
    """Testing"""
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
Da läuft etwas ziemlich schief. :-( Ich brauche es im Moment zwar nicht, aber so ein "Bug" stört mich.

lg
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:

Donnerstag 8. März 2007, 22:02

Laut "wxPython in Action" Seite 317 haben wir in unserem Code nichts falsch gemacht. :K
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 9. März 2007, 11:09

Zur Information der Code mit der notdürftigen Anpassung, damit die Ausrichtung stimmt:

Code: Alles auswählen

# -*- coding: cp1252 -*-

import  wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Tests mit Menüs', size=(400, 200))
        self.CenterOnScreen()
        tc = wx.TextCtrl(self, -1, '''Probetext''', style=wx.TE_READONLY)
        menuBar = wx.MenuBar()
        menu = wx.Menu()
        item = wx.MenuItem(menu, 101, '&Merkur')
        item.SetFont(item.GetFont())
        menu.AppendItem(item) 
        menu.Append(102, '&Venus')
        item = wx.MenuItem(menu, 103, '&Erde')
        font = item.GetFont()
        font.SetWeight(wx.FONTWEIGHT_BOLD)
        item.SetFont(font)
        menu.AppendItem(item) 
        menu.AppendSeparator()
        menu.Append(104, '&Schließen') 
        menuBar.Append(menu, '&Planeten')
        self.SetMenuBar(menuBar)
        self.Bind(wx.EVT_MENU, self.menu101, id=101)
        self.Bind(wx.EVT_MENU, self.menu102, id=102)
        self.Bind(wx.EVT_MENU, self.menu103, id=103)
        self.Bind(wx.EVT_MENU, self.CloseWindow, id=104)

    def menu101(self, event):
        print 'Merkur'

    def menu102(self, event):
        print 'Venus'

    def menu103(self, event):
        print 'Erde'

    def CloseWindow(self, event):
        self.Close()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()
MfG
HWK
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Freitag 9. März 2007, 13:00

HWK, danke für dein Snippet dass das Problem "fixt". Ich denke auch das es ein Bug ist. Ich denke ein Bug-Report an die Programmierer zu schicken wäre nicht schlecht. (Mein Englisch ist aber zu schlecht).

lg

P.S.: *Abo*
Antworten