Spezielle Ausrichtung in Menu-Wigdet

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1408
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Mittwoch 2. Juli 2008, 23:46

Hallo lunar

Ob du das nutzt, ist mir egal. Eigentlich ist mir auch egal, ob du Tk nutzt, ich muss damit ja nicht arbeiten. :K:


Da stimme ich dir 100% zu.

Danke für deine Antworten und Anregungen wünsche dir alles Gute Gruss wuf :wink:
Take it easy Mates!
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Donnerstag 3. Juli 2008, 07:55

Hallo,

der lunar kann es immer noch nicht lassen über Tkinter herzuziehen. :wink:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 3. Juli 2008, 14:15

wuf hat geschrieben:@pütone: Von mir aus kannst du deinen Code ohne weiter Konsmetik präsentieren. Ich mache keine Noten


Nee, das wäre nix gewesen. Da hängen verschiedene selbstgestrickte Module drin, insgesamt ca. 2500 Zeilen Quelltext mit viel zu viel Overhead für diese Sache.

Ich habe den Code jetzt fertig gemacht: http://paste.pocoo.org/show/78442/

Ich bin noch nicht richtig zufrieden mit dem internen Design, aber will jetzt auch nicht noch mehr Zeit hineinstecken.
Das kannst du dann ja machen bei der Arbeit am angekündigten neuen Menu-Widget ... :)
Benutzeravatar
wuf
User
Beiträge: 1408
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Donnerstag 3. Juli 2008, 17:57

Hallo pütone

wuf hat geschrieben:@pütone: Von mir aus kannst du deinen Code ohne weiter Konsmetik präsentieren. Ich mache keine Noten


Sorry da haben sich ein paar wüste Schreibfehler eingeschlichen Hi.

Vielen Dank, dass du dir Zeit genommen hast deine Code hier zu präsentieren. Habe ihn heruntergeladen und werden in einmal durcharbeiten.

Um deine gewünschte Submenu-Formatierung noch einmal zu rekapitulieren habe ich nachfolgend drei Varianten zusammengestellt (in'nicht proportionaler Schrift'):

Code: Alles auswählen

Submenu-Variante-1:
 ----------------------------
|Menu-Item-1   Ctrl-A        |
|Menu-Item-2   Ctrl Shift-A  |
|Menu-Item-3   F8            |
|....                        |
|Menu-Item-x   Shift-B       |
 ----------------------------

Submenu-Variante-2:
 ----------------------------
|Menu-Item-1           Ctrl-A|
|Menu-Item-2     Ctrl Shift-A|
|Menu-Item-3               F8|
|....                        |
|Menu-Item-x          Shift-B|
 ----------------------------

Submenu-Variante-3:
 ----------------------------
|Menu-Item-1         Ctrl-A  |
|Menu-Item-2   Ctrl Shift-A  |
|Menu-Item-3             F8  |
|....                        |
|Menu-Item-x        Shift-B  |
 ----------------------------


Es ist natürlich nicht Python-Code aber um eine 'Nicht Proportionale' Schrift darzustellen war es nötig.

So wie ich das interpretiere gilt hier die dritte Variante mit 'Proportionaler' Schrift. Ich nehme an du möchtest auch den minimalen Zwischenraum zwischen Menu-Item und dem Shortcut und den leeren Raum auf der rechten Seite des Shortcuts als Option oder als fest definierten Wert vorgeben.

OK pütone ich werden versuchen mich in deinen Code einzuarbeiten. Eventuell gibt es noch einige Fragen.

Gruss wuf :wink:

Edit (BlackJack): Ich habe mal das Python-Syntaxhighlighting aus dem ``code``-Block heraus genommen.
Take it easy Mates!
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Freitag 4. Juli 2008, 12:16

numerix hat geschrieben:
lunar hat geschrieben:Es überrascht mich immer wieder, wie man selbst die schlechtesten Bibliotheken schön reden kann ...


Du bist ja echt kein Freund von Tkinter ... :?


Weiß auch nicht, warum er hier im Subforum noch kein Hausverbot bekommen hat. ;-)
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Freitag 4. Juli 2008, 12:21

numerix hat geschrieben:Die ausbleibenden Reaktionen deute ich mal als "Es gibt keine wirkliche Lösung."

Hi,

ich bin ziemlich sicher, dass ich vor ein paar Jahren etwas zu dem Thema in einem Buch gelesen habe. Werde mal recherchieren.

Grüße,
der Michel

ps. Tkinter ist klasse: simpel und (fast) überall verfügbar!
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Freitag 4. Juli 2008, 12:31

Michael Schneider hat geschrieben:ich bin ziemlich sicher, dass ich vor ein paar Jahren etwas zu dem Thema in einem Buch gelesen habe. Werde mal recherchieren.


Das wäre toll!

Michael Schneider hat geschrieben:ps. Tkinter ist klasse: simpel und (fast) überall verfügbar!


Jawolll! 8)
Benutzeravatar
wuf
User
Beiträge: 1408
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Sonntag 6. Juli 2008, 16:53

Hallo numerix

Ich habe einmal mit der Menu-Darstellung herumgespiel. Dies nur auf Canvas-Ebene. Dein Code-Snippet habe ich nicht weiter analisiert. Ich habe nur gesehen, dass du ein Canvas verwendest um die Ausrichtung hinzukriegen. Wenn du proportionale Schriften auf einer Canvas anwendest solltest du strickt Pixel-Werte für die geometrischen Abstände verwenden.

Bei meinem neuen Menu verwende ich die elementarsten Tk-Widgets wie Canvas, Toplevel, Frame und die in Tkinter reichlich verfügbaren (genialen) Canvas-Methoden.
Ich ziehe keine Instanz von der Tk-Klasse 'Menu'. OK es gibt ein paar Zeilen Code dessen Anzahl gewisse Leute wieder als übermässig viel klassifizieren werden. .:lol:

Ich stelle dir einmal mein Code-Snippet zum experimentieren zur Verfügung. Es ist noch kein Menu-Widget!.Es zeigt nur die Darstellung von Textzeilen mit Pixel-Definierbaren Abständen.


Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# Skriptname fws_menu_research_01.py 06.07.2008
# Menu-Darstellungsversuche

import Tkinter as tk

CANCEL16_data =\
'''
R0lGODlhEAAQAMZgAL43OsU0OMozNrY8P84yNc8y
Nss0N8w0N8s1OMw1ONMyNtQyNtIzN9MzN9cyNuM0
OOQ0OOM1OeQ1OM8+QuA4POs3O+s3POVESP87QP88
QP88Qv89QuJKTv8+Q+RKTuVKTuZKTf9AReBRVPtH
TPhJTfxITPxITfxKTtxbXvZQVORYXNVfYeNbXttl
aOxlaOBsb+5matxvcvJmaehucul0eP9tceV6fOp6
fvx0d+aAgvx3evh7fuWNj+eNkOiOkOaQkvKMj+aS
lOyQk+SYmvKTleyfoemho+qkpvWoquywse64uvC5
u++6vPHExvLJyvLJy/PMzPTOzv/Oz/7Q0fTV1vrY
2fba2vbd3vji4vjj5Pjk5fno6Prr7Prt7fvy8vzy
8v//////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/////////yH+FUNyZWF0ZWQgd2l0aCBUaGUgR0lN
UAAh+QQBCgB/ACwAAAAAEAAQAAAHuYB/goOEhYUM
DhAiKBILAoZ/DSBIWl5eXEsqBIcuVFifoFc2m4IF
H01WX1GrUalQLAGCC0JKXWBdSkpPYGBOQwqCFEZH
R1tgW0y8SSQYD4IcPD9BQVm8YEQpGhkVghczNDcy
O7xSG+YaFgN/ESPtOORg5R0hErImJzq8NRtSYFMl
JoD9EeABRhUwQGAoPAjEA4BBB17kKJKjYsUiLwwU
StCih4+PPnq0QAApwIQVMWKsmPAQEiF1hgIBADs=
'''

FILEOPEN16_data =\
'''
R0lGODlhEAAQAOe1AAALuwALvAAMuQASpgAQtQAS
qwASsAAWrgAVwAAYvAAZyAQftgAeyQAk0gcmyQgq
uA8prgAp2gQxvxUrtwMzwwYw2hYzqgg/yh06rgg8
5CFAshFKzyVHuBZL4zFIxBZP7StPvTlRuzFWxB1Z
6yFc0zhTzi9Y0SZd5zddyilj1zte2ihk8jpi0Cdn
9jxl0Dln0zBq8zlr20Fp0kBn4Vpju0Fr1Thw20Ru
1UZw2l1rwy59/ER83WhywEZ/3jyA+0iA3kmA4EiB
3kmB4Fp72DeG/kuD4EuD51h96EeE+U6E50+G4HJ6
xVKI5EyI+2+Cz0+O52CH4kaQ/liN6FWQ42SN4mGP
50uW/oKIzG6P3VeY+VmY/HSR3myW5mWZ816c/ImV
12Sk+WWk/m+j8nif84ag54aj6G+r/nar7puh24mo
6ICv842r64iu96Oo3aGq3aqqyn24/ZKy8Je26IW/
9Y+89Y+98ZW77LWyz7Wy1o/E+5fA/IXM/p/C8Lu4
2p/F96fC9b+917HF8cXD4MTD5KLV+Jva/M7K4cjO
86be/K/a/tHO5qne/rjY+M7Q8NHT7a/m/NvX7NzY
6bns/Lnt/tze99Dk+N7e9+Le8cjt/r/y/uPi+Obk
+9rr/Obm++vn8ujo++np++zp98j7/uzr/Mr8/sv9
/u7u/tX7/c/+/vHx+/Lx/vLy/vbz/OH+/vn2+/f3
/vv2/v34/vz8/v79/v7+/v//////////////////
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/yH+FUNyZWF0ZWQgd2l0aCBUaGUgR0lNUAAh+QQB
CgD/ACwAAAAAEAAQAAAI7gD/CRxIsKBBgjyWHDR4
pRElGgRJSEliZIPANqBUjUJDUIgkRIXOOHEka1Wn
TZZyDFRC6pEdN6lovTL1SdOhLwOLiJIziJZPWrFg
bcEBhYWJB0BK1cESZ02aMmSGxMgSxcqJBT1QPaHy
xw8dNWK6hCGiY0SCAzsy2eBU6dQiOFp8tOjgAACB
fz/mVGlFKI+ZJjA+VGCAIICBf0Gm8Jm0B4wXJCsy
RGigQECBfymYMMKUSA+bMUdmqCjhYYLAC1xm0ZrF
KtQlSIoE9cETQiCFQD9pufIUyRCgO28gCJTw4kYN
GS5QiADBQQMGCwMEBgQAOw==
'''

def name_width(text):
    """Ermittelt die Breite und Höhe des Namens in Pixel"""

    name_obj = dummy_canvas.create_text(
        0,0,
        text = text,
        font = menu_font
        )
    x1,y1,x2,y2 = dummy_canvas.bbox(name_obj)

    return ((x2-x1),y2)

root = tk.Tk()
root.geometry('500x250')
root.title('Canvas-Menu')
root['bg'] = 'steelblue2'

ICON_FILEOPEN = tk.PhotoImage(data=FILEOPEN16_data)
ICON_CANCEL   = tk.PhotoImage(data=CANCEL16_data)

frame = tk.Frame(root,
    )
frame.place(x=10,y=10)

dummy_canvas = tk.Canvas(frame,
    )
dummy_canvas.pack()

menudata = {
    "Datei":[
    (None,"Neu","Strg+N","Control-n"),
    (ICON_FILEOPEN,"Öffnen","Strg+O","Control-o"),
    (None,"Speichern","Strg+S","Control-s"),
    (None,"Speichern unter","Strg+Umschalt+S","Control-Shift-S"),
    (ICON_CANCEL,"Beenden","","")]}

#~~ Geometrie
meun_start_gap   = 5
menu_inter_gap   = 20
menu_end_gap     = 20
menu_icon_width  = 20
menu_icon_height = menu_icon_width

#~~ Zeichensatz
menu_font = ('Helvetica','10','normal','roman')

text_height        = 0
max_item_width     = 0
max_shortcut_width = 0

for icon,item,shortcut1,shortcut2 in menudata['Datei']:
    item_width,height = name_width(item)
    if max_item_width < item_width:
        max_item_width = item_width

    shortcut_width,height = name_width(shortcut1)
    if max_shortcut_width < shortcut_width:
        max_shortcut_width = shortcut_width

text_height = height

if text_height < menu_icon_height:
    menu_bar_height = menu_icon_height + 4
else:
    menu_bar_height = text_height + 4

max_menu_bar_width = menu_icon_width + meun_start_gap + max_item_width +\
    menu_inter_gap + max_shortcut_width + menu_end_gap

xpos_item = menu_icon_width + meun_start_gap
xpos_shortcut = xpos_item + max_item_width + menu_inter_gap +\
    max_shortcut_width

dummy_canvas.destroy()

print menu_bar_height,text_height

for index,data in enumerate(menudata['Datei']):
    icon,item,shortcut = data[0:3]

    menu_bar = tk.Canvas(frame,
        width  = max_menu_bar_width,
        height = menu_bar_height,
        highlightthickness = 0
        )
    menu_bar.pack(side='top')

    if icon:
        menu_bar.create_image(
            menu_icon_width/2,menu_bar_height/2,
            image  = icon,
            anchor = 'center'
            )

    if item != "":
        menu_bar.create_text(
            xpos_item, float(menu_bar_height)/2.0,
            text = item,
            font = menu_font,
            anchor = 'w'
            )

    if shortcut != "":
        menu_bar.create_text(
            xpos_shortcut, float(menu_bar_height)/2.0,
            text   = shortcut,
            font   = menu_font,
            anchor = 'e',
            )

root.mainloop()


Eventuell kannst du etwas davon für dein Code-Snippet verwenden.

OK. Gruss :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Sonntag 6. Juli 2008, 20:48

Optisch (und mehr ist es ja noch nicht) sieht es wirklich ansprechend aus.

Das mit der pixelweisen Berechnung/Ausrichtung ist klar, das ist ja auch der einzige Grund, warum ich für die rechtsbündige Ausrichtung der Shortcuts im Menü ein Canvas einsetze. Anders als bei der Beschränkung auf ein reines Canvas (wie bei deinem Beispiel) bleibt mir bei Verwendung des Tk-Menu-Widgets aber nichts anderes übrig, als den Zwischenraum zwischen Menüname links und Shortcut rechts mit Leerzeichen aufzufüllen.

Das geht eben nicht aufs Pixel genau, sondern liefert kleine Abweichen bis max. 1 px weniger als die Breite eines Leerzeichens im verwendeten Zeichensatz.

Gebrauchen kann ich deinen Code leider nicht, weil ich (der Einfachheit halber) gerne auf der Funktionalität des Menu-Wigdets aufsetzen will.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 7. Juli 2008, 11:08

Hallo Numerix,

ich kann mir gut vorstellen, dass es Probleme bei proportionaler Schrift gibt. Aber braucht man die in Menüeinträgen unbedingt? Wenn nicht, kann man sie doch ausschalten und dann die Menüeinträge formatieren:

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
root.geometry("400x300+100+100")

file_menu_entries = ({"label":("oeffnen", "strg+o"),
                          "underline":0,
                    "command":None},
                   
                     {"label":("speichern", "foo+s"),
                     "underline":0,
                    "command":None},
                   
                {"label":("beenden", "alt+b"),
                    "underline":0,
                   "command":root.destroy})

menubar = tk.Menu(root)
file_menu = tk.Menu(menubar, tearoff=False)

menubar.add_cascade(label="datei", menu=file_menu, underline=0)

for fme in file_menu_entries:
   file_menu.add_command(label="%-10s %7s"%fme["label"],
                         command=fme["command"],
                    underline=fme["underline"])

root.config(menu=menubar)
root.mainloop()

Muss es proportionale Schrift sein?

Gruß,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Montag 7. Juli 2008, 13:14

Naja, was heißt "MUSS"?
Natürlich MUSS es nicht, aber ich hätte halt gerne auch, dass es - trotz Tkinter - optisch anständig aussieht. Was du mit "ausschalten" der proportionalen Schriften meinst, weiß ich jetzt zwar nicht, aber ich kann ja via font-Option die Schriftart setzen. Natürlich habe ich das auch mit fixen Schriften gemacht und damit ist die Ausrichtung natürlich kein Problem mehr, aber

a) entweder wählt man für die immer sichtbare Menüleiste die gleiche Schrift; dann sieht das echt aus wie von vorgestern
b) oder man wählt nur für die ausklappenden Menüs die fixe Schrift (was ja zur Problemlösung genügen würde). Das sieht dann aber beim ausklappen aus wie Hund.

Dein Code hilft da jetzt eigentlich gar nicht weiter. Da du keinen Font vorgibst, wird die Systemvoreinstellung verwendet. Bei mir ist das eine proportionale Schrift und es sieht eben dann nicht schön aus: Die Shortcuts flattern - sind weder rechts- noch linksbündig.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 7. Juli 2008, 22:47

numerix hat geschrieben:Dein Code hilft da jetzt eigentlich gar nicht weiter. Da du keinen Font vorgibst, wird die Systemvoreinstellung verwendet. Bei mir ist das eine proportionale Schrift und es sieht eben dann nicht schön aus: Die Shortcuts flattern - sind weder rechts- noch linksbündig.

Hi numerix,

ich wollte eigentlich nur die Formatierung demonstrieren, ist dann aber etwas mehr geworden. Die Schriftart würde ich, wie Du schon sagtest, über die font-Resource festlegen.
Deine Einstellung, dass eine monospaced Type irgendwie altmodisch oder "wie Hund" aussieht, kann ich absolut nicht teilen. Ich würde jederzeit, zumindest für Menüs, eine nicht proportionale Schrift den Proportionalen vorziehen.

Gruß,
Michael

ps. Das Buch hatte ich mir vermutlich ausgeliehen und ich komme frühestens Donnerstag wieder in die Bib.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Dienstag 8. Juli 2008, 04:55

Michael Schneider hat geschrieben:Deine Einstellung, dass eine monospaced Type irgendwie altmodisch oder "wie Hund" aussieht, kann ich absolut nicht teilen. Ich würde jederzeit, zumindest für Menüs, eine nicht proportionale Schrift den Proportionalen vorziehen.


Tja, so sind eben die Geschmäcker verschieden. :wink:

Das Buch hatte ich mir vermutlich ausgeliehen und ich komme frühestens Donnerstag wieder in die Bib.


Mach dir keine unnötigen Umstände. Und eilig ist es ja auch nicht!
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 18. Dezember 2008, 13:03

numerix hat geschrieben:Ich habe den Code jetzt fertig gemacht: http://paste.pocoo.org/show/78442/

Hab den mal geändert: http://paste.pocoo.org/show/95864/
diff: http://paste.pocoo.org/compare/95864/78442/

Aber so gefällt mir das noch nicht. IMHO sollte kein Handler für alle Menü-Punkte definiert werden.
Außerdem sollte das bauen des Menüs in MenuPlus verschoben werden...

Auch halte ich es für überflüssig shortcut und keycode zu trennen. Warum nicht für beides den keycode nutzten?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 18. Dezember 2008, 13:32

Ich hab mal in die Sourcen der IDLE geschaut (.Lib\idlelib\EditorWindow.py) demnach ist das Formatieren über ein Canvas vollkommen überflüssig, wenn man menu.entryconfig() nutzt ;)

Ich versuche mal das ganze umzubauen...

EDIT: So, fertig: http://paste.pocoo.org/show/95874/
Ist alles so viel einfacher...

Aber noch eine dumme Sache:

Wenn man auf ein Menu-Punkt über den keycode aufgerufen wird, wird dabei der Methode tk.event übergeben. Wenn man mit der Maus drauf klickt aber nicht.
Deswegen hab ich überall *args eingefügt. Ist aber unschön. Wie geht's einheitlich?

EDIT: Ich denke die IDLE macht es ähnlich z.B.:

Code: Alles auswählen

    def help_dialog(self, event=None):
Zuletzt geändert von jens am Donnerstag 18. Dezember 2008, 16:15, insgesamt 1-mal geändert.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder