Hi wuf,
an der Python Version liegt es sicher nicht, sondern an der tkinter Version.
Ist genaugenommen ein tkinter Fehler. Liefert einen Wert den es selber nicht annimmt.
Da müssen wir eben einen Workaround für diesen speziellen Fall machen.
Übrigends, der Export nach tk ohne Namen ist jetzt tkinter kompatibel. Das Modul DynTkInter.py braucht man dann nicht mehr für diese exportierten Scripts.
Lediglich ein kleines Modul für Spezielfälle, wie Grid Tabelle und Menüs ist bei Bedarf erforderlich. Hier etwa ein Menü Export:
Code: Alles auswählen
import tkinter as tk
import DynTkExtend as ext
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
self.main_menu = MainMenu(self,**{'activebackground': '#ececec'})
self.main_menu.select_menu()
class MainMenu(ext.Menu):
def __init__(self,master,**kwargs):
ext.Menu.__init__(self,master,**kwargs)
self.file_cascade = FileCascade(self,'cascade',**{'label': 'File'})
self.file_cascade.layout(index=1)
class FileCascade(ext.MenuItem):
def __init__(self,master,item,**kwargs):
ext.MenuItem.__init__(self,master,item,**kwargs)
self.Menu = Menu(self,**{'activebackground': '#ececec'})
self.Menu.select_menu()
class Menu(ext.Menu):
def __init__(self,master,**kwargs):
ext.Menu.__init__(self,master,**kwargs)
self.file_export = ext.MenuItem(self,'command',**{'label': 'Export'})
self.file_load = ext.MenuItem(self,'command',**{'label': 'Load'})
self.file_save = ext.MenuItem(self,'command',**{'label': 'Save'})
self.separator = ext.MenuItem(self,'separator')
self.file_save.layout(index=1)
self.file_export.layout(index=2)
self.separator.layout(index=3)
self.file_load.layout(index=4)
Application().mainloop()
Und das ist das Modul DynTkExtend.py:
Code: Alles auswählen
import tkinter as tk
# == Fill Listbox with Text ==============================================
def fill_listbox_with_string(listbox,string):
listbox.delete(0,'end')
for e in string.split("\n"): listbox.insert('end',e)
# ======= Grid Table ======================================================
def grid_configure_multi(data):
count = data[0]
multi = []
for i in range(count): multi.append([False,None])
for i in range(len(data)):
if i != 0:
multi[data[i][0]] = [True,{'minsize':data[i][1],'pad':data[i][2],'weight':data[i][3]}]
return multi
def grid_configure_cols(container,grid_conf_cols,grid_multi_conf_cols,isColumns=True):
cols = grid_conf_cols[0]
if len(grid_multi_conf_cols) == 0:
for i in range(cols): grid_multi_conf_cols.append([False,None])
to_insert = {'minsize':grid_conf_cols[1],'pad':grid_conf_cols[2],'weight':grid_conf_cols[3]}
for col in range(cols):
if grid_multi_conf_cols[col][0] == False:
grid_multi_conf_cols[col][1] = dict(to_insert)
for col in range(cols):
if isColumns:
container.grid_columnconfigure(col,**(grid_multi_conf_cols[col][1]))
else:
container.grid_rowconfigure(col,**(grid_multi_conf_cols[col][1]))
def grid_table(container,grid_rows = None, grid_cols = None, grid_multi_rows = None, grid_multi_cols = None):
grid_multi_conf_cols = []
grid_multi_conf_rows = []
if grid_multi_rows != None:
grid_conf_individual_has = True
grid_multi_conf_rows = grid_configure_multi(eval(grid_multi_rows))
if grid_multi_cols != None:
grid_conf_individual_has = True
grid_multi_conf_cols = grid_configure_multi(eval(grid_multi_cols))
if grid_cols != None:
grid_conf_cols = eval(grid_cols)
grid_configure_cols(container,grid_conf_cols,grid_multi_conf_cols)
if grid_rows != None:
grid_conf_rows = eval(grid_rows)
grid_configure_cols(container,grid_conf_rows,grid_multi_conf_rows,False)
# ========= Trigger sash_place in a PanedWindow after some time ==========================
def trigger_sash_place(pane_window,time,index,x_coord,y_coord):
pane_window.after(time,lambda i = index, x = x_coord, y=y_coord, function = pane_window.sash_place: function(i,x,y))
# ========= Menu and MenuItem ==========================
def find_root(begin):
root = begin
while not (isinstance(root,tk.Tk) or isinstance(root,tk.Toplevel)):
root = root.master
return root
class Menu(tk.Menu):
def __init__(self,master,**kwargs):
if isinstance(master,MenuItem):
tk.Menu.__init__(self,find_root(master),**kwargs)
else:
tk.Menu.__init__(self,master,**kwargs)
self.master = master
self.itemlist = []
def select_menu(self):
menubase = self.master if (isinstance(self.master,MenuItem) or isinstance(self.master,tk.Menubutton)) else find_root(self)
menubase.config(menu=self)
def add_to_itemlist(self,menu_item):
self.itemlist.append(menu_item)
def get_item_index(self,menu_item):
index = -1
for i in range(len(self.itemlist)):
if self.itemlist[i] == menu_item:
index = i;
break
return index
def remove_from_itemlist(self,menu_item):
self.itemlist.pop(self.itemlist.index(menu_item))
def item_list_len(self):
return len(self.itemlist)
def destroy(self):
if isinstance(self.master,MenuItem): self.master = find_root(self)
tk.Menu.destroy(self)
class MenuItem:
def __init__(self,master,mytype='command',**kwargs):
self.mytype = mytype
self.master = master
master.add_to_itemlist(self)
master.add(mytype,**kwargs)
def destroy(self):
index = self.master.get_item_index(self)
self.master.delete(index+1)
self.master.remove_from_itemlist(self)
def layout(self,**kwargs):
self.item_change_index(**kwargs)
def item_change_index(self,index):
old_index = self.master.get_item_index(self)
new_index = old_index
try:
new_index = int(index) -1
except ValueError: return
if new_index != old_index:
limit = self.master.item_list_len()
if new_index >= 0 and new_index < limit:
confdict = dict(self.get_confdict())
self.master.delete(old_index+1)
self.master.insert(new_index+1,self.mytype,confdict)
del self.master.itemlist[old_index]
self.master.itemlist.insert(new_index,self)
def config(self,**kwargs):
index = self.master.get_item_index(self) + 1
self.master.entryconfig(index,**kwargs)
def get_confdict(self):
index = self.master.get_item_index(self) + 1
dictionary = {}
for entry in (
'activebackground',
'activeforeground',
'accelerator',
'background',
'bitmap',
'columnbreak',
'command',
'font',
'foreground',
'hidemargin',
'image',
'indicatoron',
'label',
'menu',
'offvalue',
'onvalue',
'selectcolor',
'selectimage',
'state',
'underline',
'value',
'variable'
):
try:
dictionary[entry] = self.master.entrycget(index,entry)
except tk.TclError: pass
return dictionary