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. .
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