
Und das Grid Layout ist vom Allerfeinsten
Habe das Grid Layout ausführlich dokumentiert, siehe: https://github.com/AlfonsMittelmeyer/py ... -messaging
Ja, die Intro ist sowieso veraltet. Da habe ich schon lange nichts mehr gemacht. Ich werde aber auf Github die Beschreibung ergänzen. Da ist im letzten Monat auch eine gehörige Menge neu hinzugekommen.chessyman hat geschrieben:Hallo,
ich finde deinen GUI Designer sehr interessant. Scheint ja eine Menge zu bieten.
Habe mal angefangen die intro.py durchzugehen. Leider fehlt im Layoutfenster ein vertikaler Scrollbalken, so dass ich auf der Seite mit dem Grid Layout leider nicht mehr weiterkomme, da die next/back-Buttons nicht mehr angezeigt werden (auf Notebook mit Auflösung 1366*768 Pixeln). Man kann den Rest vom untenstehenden Text auch schon nicht mehr lesen.
Ich nehme an, bei HD-Auflösung ist kein Scrollbalken nötig, aber bei weniger schon.
Vielleicht könntest du das noch nachbessern ...
Herzliche Grüße
Christian
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
try:
from tkinter import ttk
except ImportError:
import ttk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.combobox = ttk.Combobox(self)
self.combobox['values'] = ('Message', 'Label', 'Entry', 'Button', 'Checkbutton', 'Radiobutton', 'Spinbox', 'Scale', 'Scrollbar', 'Frame', 'LabelFrame', 'PanedWindow', 'Listbox', 'Text', 'Canvas', 'Menu', 'Menubutton', 'Paint Canvas')
self.combobox.current(newindex = 0)
self.combobox.pack()
if __name__ == '__main__':
Application().mainloop()
Diese Beurteilung ist mE falsch. Ein XML-Format (oder jedes andere *ausser* Code zu generieren, kann auch JSON oder YAML oder wegen mir CSV sein) hat den klaren Vorteil, wieder einladbar zu sein vom Designer. Du hast also die Moeglichkeit, ueber die Zeit an deiner GUI zu arbeiten. Python Code zu generieren macht das unmoeglich.chessyman hat geschrieben: pygubu ... habe das gerade entdeckt und finde es auf den ersten Blick sehr übersichtlich, die Widgets linksseitig als Tree anzuordnen (mit kleinen Icons). Sieht sehr professionell aus. Leider wird hier der Umweg über XML-Dateien gegangen
Das ist ein Fehlbeurteilung. Es gibt den Export mit Namen und daraus läßt sich auch das Script vollständig wiedergewinnen. Der GuiDesigner kann beliebigen Python Code übernehmen. Allerdings, wenn man nicht von der Möglichkeit Gebrauch macht, einen Namen mit anzugeben, heißen alle Buttons nur 'button'.__deets__ hat geschrieben:Diese Beurteilung ist mE falsch. Ein XML-Format (oder jedes andere *ausser* Code zu generieren, kann auch JSON oder YAML oder wegen mir CSV sein) hat den klaren Vorteil, wieder einladbar zu sein vom Designer. Du hast also die Moeglichkeit, ueber die Zeit an deiner GUI zu arbeiten. Python Code zu generieren macht das unmoeglich.chessyman hat geschrieben: pygubu ... habe das gerade entdeckt und finde es auf den ersten Blick sehr übersichtlich, die Widgets linksseitig als Tree anzuordnen (mit kleinen Icons). Sieht sehr professionell aus. Leider wird hier der Umweg über XML-Dateien gegangen
Da hatte ich auch schon daran gedacht. Mit der Treeview habe ich mich noch nicht auseinandergesetzt. Das Widget wird zwar vom GuiDesigner angeboten, aber nur das Widget selbst. Normalerweise wird man ja eine dynamische Treeview haben und die selber programmieren. Aber schön wäre es, wenn man schon einmal eine Vorlage dafür mit dem GuiDesigner erstellen könnte.chessyman hat geschrieben:habe das gerade entdeckt und finde es auf den ersten Blick sehr übersichtlich, die Widgets linksseitig als Tree anzuordnen (mit kleinen Icons). Sieht sehr professionell aus.
Das ist jetzt dumm, ich habe Windows und Linux, aber keinen Mac. Unter Linux, hatte ich Farben für commands im Menü verwendet. Windows stellt aber die Farben nicht dar. Aber dass der Mac dann nicht einmal ein Menü anzeigt?__deets__ hat geschrieben:Da ich bei mir keine GUIs gebaut bekomme - wahrscheinlich weil du irgendetwas komisches mit den Menues machst, das unterm Mac nicht funktioniert - kann ich deine Behauptung nicht nachvollziehen, und bleibe bei meiner aus jahrelanger Erfahrung bestehenden Einschaetzung...
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.menu = Menu_1(self)
self['menu'] = self.menu
class Menu_1(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
# widget definitions ===================================
self.Menu = Menu_2(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.Menu,label='File', underline=0)
self.Menu_1 = Menu1(self,tearoff=0, bg='white', fg='black', selectcolor='blue', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.Menu_1,label='Special', underline=0)
self.menu = Menu_3(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.menu,label='Help')
self.add_command(label='Create ON', underline=0, background='lightgreen')
self.add_command(label=' ', state='disabled')
self.add_command(label='Config ON', underline=1, background='lightgreen')
self.add_command(label=' ', state='disabled')
self.add_command(label='Layout ON', underline=0, background='lightgreen')
self.add_command(label=' ', state='disabled')
self.add_command(label='Mouse ON', underline=0, background='lightgreen')
self.add_command(label='Hide', underline=0)
class Menu_2(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.backup_img = tk.PhotoImage(file = 'guidesigner/images/filesave.gif')
self.add_command(compound='left', image=self.backup_img, label='Backup', underline=0)
self.Save_img = tk.PhotoImage(file = 'guidesigner/images/geany-save-all.gif')
self.add_command(compound='left', image=self.Save_img, label='Save', underline=0)
self.Load_Edit_img = tk.PhotoImage(file = 'guidesigner/images/gtk-open.gif')
self.add_command(compound='left', image=self.Load_Edit_img, label='Load & Edit', underline=0)
self.add_command(label='Load & Run')
self.Menu = Menu_4(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.Menu,label='Split & Join')
self.add_separator()
self.Export_img = tk.PhotoImage(file = 'guidesigner/images/document-save-as.gif')
self.Menu_1 = Menu1_1(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.Menu_1,compound='left', image=self.Export_img, label='Export tkinter', underline=0)
self.Menu_2 = Menu2(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.Menu_2,label='Save Access')
self.add_separator()
self.Quit_img = tk.PhotoImage(file = 'guidesigner/images/application-exit.gif')
self.add_command(compound='left', image=self.Quit_img, label='Quit')
class Menu_4(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.add_command(label='Help')
self.add_separator()
self.add_command(label='Save (part)')
self.add_command(label='Save (config - part)')
self.add_command(label='Load & Edit (part)')
self.add_command(label='Load & Run (part)')
class Menu1_1(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.add_command(label='Help')
self.add_separator()
self.add_command(label='tkinter', underline=0)
self.add_command(label='tkinter (names)', underline=9)
self.add_command(label='tkinter (Designer)', underline=9)
class Menu2(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.add_command(label='Widget Depth')
self.add_command(label='Container Depth')
class Menu1(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='blue', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.Refresh_img = tk.PhotoImage(file = 'guidesigner/images/view-restore.gif')
self.add_command(compound='left', image=self.Refresh_img, label='GuiDesigner Refresh', underline=0)
self.GUI_Refresh_img = tk.PhotoImage(file = 'guidesigner/images/fullscreen.gif')
self.add_command(compound='left', image=self.GUI_Refresh_img, label='GUI Refresh', underline=4)
self.Toproot_img = tk.PhotoImage(file = 'guidesigner/images/top.gif')
self.add_command(compound='left', image=self.Toproot_img, label='Toproot')
self.add_separator()
self.add_command(activebackground='white', label='Navigation Order', state='disabled')
self.alphabetical_img = tk.PhotoImage(file = 'guidesigner/images/tools-check-spelling.gif')
self.add_radiobutton(value='alphabetical', compound='left', label='alphabetical', image=self.alphabetical_img, underline=0)
self.z_order_img = tk.PhotoImage(file = 'guidesigner/images/sort-ascending.gif')
self.add_radiobutton(value='basement', compound='left', label='z-order', image=self.z_order_img, underline=0)
self.i_order_img = tk.PhotoImage(file = 'guidesigner/images/index.gif')
self.add_radiobutton(value='index', compound='left', label='pack index', image=self.i_order_img, underline=0)
self.add_separator()
self.ExpertOptions_img = tk.PhotoImage(file = 'guidesigner/images/meeting-chair.gif')
self.Menu = Menu_5(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.Menu,compound='left', image=self.ExpertOptions_img, label='Expert Options')
class Menu_5(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.add_command(label='Help')
self.add_separator()
self.add_command(label='Code')
class Menu_3(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.add_command(label='Introduction')
self.add_command(label='Config Options')
self.add_command(label='Tuple Entries')
self.add_command(label='Menu Entries')
self.add_command(label='Backup')
self.add_command(label='Save & Load')
self.add_command(label='Export tkinter')
self.add_command(label='Save Access')
self.add_separator()
self.menu = Menu_6(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.menu,label='Programming')
self.menu_1 = Menu1_2(self,tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
self.add_cascade(menu=self.menu_1,label='Code in Scripts')
self.add_command(label='Examples')
class Menu_6(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.add_command(label='Load Scripts')
self.add_command(label='Access Widgets')
self.add_command(label='Access Toplevel')
class Menu1_2(tk.Menu):
def __init__(self,master,**kwargs):
tk.Menu.__init__(self,master,**kwargs)
self.config(tearoff=0, bg='white', fg='black', selectcolor='black', relief='solid', activebackground='#7bfeff', activeforeground='black', disabledforeground='grey64')
# widget definitions ===================================
self.add_command(label='Functions')
self.add_command(label='Namespace')
self.add_command(label='Imports')
self.add_command(label='DynTkImports')
self.add_command(label='Relative Access')
self.add_command(label='Root Access')
self.add_command(label='Place for Code')
self.add_command(label='DynAccess')
if __name__ == '__main__':
Application().mainloop()
Oh, mein Gott, Du sprichst von meiner intro.py. Vom Eingangsbild. Ja, das ist nur ein Bildchen, ein Photoimage vom Menü. Da rührt sich natürlich nichts.__deets__ hat geschrieben:Ich weiss jetzt nicht, was da passieren soll - aber es tut sich nix weiter. Es laeuft, aber ich bekomme keine Menues.
Ich vermute weniger das Farben ein Problem sind (die werden wahrscheinlich auch ignoriert, aber das ist ja nicht schlimm), aber der Mac erlaubt wahrscheinlich keine Menues die nur aus einem Eintrag bestehen und keine Items haben. Du hast ja im Grunde (so interpretiere ich deine intro.py) Buttons emuliert. Das geht halt nicht.
Ach so, im Gui Designer ist ein Menü. Da steht 'Create ON'. Wenn Du da draufdrückst, dann geht die Spalte zum Widget Erzeugen auf.__deets__ hat geschrieben:So blöd bin ich nicht. In deiner Intro.py ist ein BILD das zeigt wie man einen Button erzeugt. Diesen Menüpunkt habe ich nicht in Main.py
Kann man beim Mac im Hauptmenü nur Cascaden machen? Und keine commands, checkbuttons und radiobuttons? Wenn dem so ist, dann hatte ich das nicht gewußt. OK, dann braucht man noch eine extra Leiste für diese Buttons. Werde schauen, ob ich dafür bei Create Widgets, den Platz ein wenig kleiner machen kann, sodass sich in der Höhe kaum Unterschied ergibt.__deets__ hat geschrieben:Darum schrieb ich "Mac erlaubt wahrscheinlich keine Menues die nur aus einem Eintrag bestehen und keine Items haben. Du hast ja im Grunde (so interpretiere ich deine intro.py) Buttons emuliert. Das geht halt nicht."
Und mit "interpretiere ich intro.py" meine ich "interpretiere ich was Intro.py an Screenshots zeigt".