Das Startscript ist matlib.py
Code: Alles auswählen
import DynTkInter as tk
tk.Tk().mainloop('Scripts/app.py')
Das ist die Hauptanwendung app.py:
Code: Alles auswählen
config(myclass='BOStrab_Fahrzeugeinschraenkung')
Menu('MainMenu',link='Scripts/menu.py').select_menu()
Und Außerdem sieht man, dass die App bisher nur ein Menü enthält.
In das Menü werden die widgets aus menu.py geladen und dabei etwaiger Code ausgeführt.
Das ist nun das Menü menu.py
Code: Alles auswählen
config(myclass='MenuGUI')
MenuItem('languages','cascade',label='Sprachen')
goIn()
Menu('language_submenu',link='Scripts/languages.py').select_menu()
goOut()
MenuItem('test','command',label='Test')
widget('languages').layout(index=1)
widget('test').layout(index=2)
### CODE ===================================================
class MainMenu:
def __init__(self,language = widget('languages'),test=widget('test')):
self.language = language
subscribe('MENU_LANGUAGE',self.receive_language)
# for testing
test['command'] = self.test
def receive_language(self,languages):
self.language['label'] = languages[0] # this should be written as entryconfig for tkinter
publish('SUBMENU_LANGUAGES',languages[1:])
def test(self):
current_selection = Selection() # for GuiDesigner the selection shouldn't change
Toplevel('test',title = 'Testing',link='Scripts/tests.py')
setSelection(current_selection) # for GuiDesigner the selection shouldn't change
MainMenu()
### ========================================================
Außerdem habe ich zum Testen einen Command Button namens 'test' angelegt. WEnn man diesen Button drückt, legt er ein Toplevel an und lädt dort test.py herein
Nun ein Blick auf test.py
Code: Alles auswählen
# -*- coding: utf-8 -*-
Button('english',text='english')
Button('german',text='german')
widget('german').pack(side='left')
widget('english').pack(side='left')
### CODE ===================================================
class TestApplication:
def __init__(self,german = widget('german'), english = widget('english')):
german['command'] = partial(self.send_language,0)
english['command'] = partial(self.send_language,1)
def send_language(self,index):
language_lists = (
( 'Sprache',('deutsch','german'),None,('englisch','english'),('französisch','french')),
( 'Language',('english','english'),None,('french','french'),('german','german'))
)
publish('MENU_LANGUAGE',language_lists[index])
TestApplication()
### ========================================================
Ein Blick zurück zum Menü zeigt, dass dort mit dem ersten Element dieser Liste der Text er Cascade geändert wird.Annchließend wird er Rest der Liste mittels SUBMENU_LANGUAGES zum Submenü gesandt
Und dort in languages.py wird dannn das Submenü entsprechend dieser Liste neu aufgebaut und mit ensprechenden Commands versehen
Code: Alles auswählen
config(myclass='LanguageSubmenu', tearoff=0)
MenuItem('deutsch','command',label='deutsch')
widget('deutsch').layout(index=1)
### CODE ===================================================
# this shall later be exported in another form from widgets in tkinter style
# later the GuiDesigner should be able to create such a code
# this name doesn't matter. Only for better recognition
class LanguageSubmenu:
def __init__(self,container = container()):
self.container = container
self.deutsch_index = self.container['tearoff']
subscribe('SUBMENU_LANGUAGES',self.receive_languages)
def receive_languages(self,languages):
current_selection = Selection() # for GuiDesigner the selection shouldn't change
self.create_menu(languages) # create the submenu commands annd separators
self._dont_save_dynamically_created() # the GUIDesigner shouldn't save dynamically created commands
setSelection(current_selection) # for GuiDesigner the selection shouldn't change
# here should follow own code in tkinter style
# later the GuiDesigner should be able to export this code
# EXPORT =============================
# after GUI definition: the Code ===========================
# this code may also be inserted in GuiDesigner Scripts
def create_menu(self,languages):
# for calling more times, delete the menu, which existed before,
# except the first command
# for marking the end
self.container.add_checkbutton()
# now we delete the menu entries after deutsch
after_deutsch = self.deutsch_index + 1
while True:
itemtype = self.container.type(after_deutsch)
self.container.delete(after_deutsch)
if itemtype == 'checkbutton':
break
# now we make a dynamic creation
# first we get the style of the first command
# this style should also be used for the other commands
command_config = get_entryconfig(self.container,self.deutsch_index)
# we dont't use some now not defined languagefile[i]
# we can think later of this
# now we create dynamic commands
# Example
# languages = (('Deutsch','german'),None,('English','english'),('Spanisch','spanish'),('Französisch','french'))
for index,language in enumerate(languages):
if not language:
self.container.add_separator()
continue
command_config['label'] = language[0]
command_config['command'] = partial(self.do_action,language[1])
try:
self.container.entryconfig(index+self.deutsch_index,**command_config)
except IndexError:
self.container.add_command(**command_config)
def do_action(self,language):
publish("SELECT_LANGUAGE",language)
# /EXPORT =============================
# we don't want to save dynamically created widgets after self.deutsch_index
# by the GuiDesigner
def _dont_save_dynamically_created(self):
start_index = self.deutsch_index - self.container['tearoff']
for element in self.container.PackList[start_index+1:]:
element.dontSave()
LanguageSubmenu()
### ========================================================
Wenn Dir diieser Script Code nicht gefällt. Macht nichts, kann man am Ende, wenn alles fest steht, wieder in eine Normalform bringen.