2016-07-20 5 views
1

Okay, zuerst weiß ich nicht, was das eigentliche Problem hier ist, so dass ich nicht mit einem genaueren Titel kommen konnte. Vielleicht können einige von Ihnen es bearbeiten, um es genau zu machentkinter.TclError: ungültiger Befehlsname "Tabelle"

Das folgende ist der minimalisierte Code, um das Problem zu reproduzieren, das ich habe.

from traybar import SysTrayIcon 
from cal import Calendar 
import Tkinter 

class Add(): 
    def __init__(self,master): 
     Calendar(master).pack() 

def add(systray): 
    root = Tkinter.Tk() 
    Add(root) 
    root.mainloop() 

SysTrayIcon("abc.ico","abc", (('Add',None, add),) ,default_menu_index=0).start() 

Die cal und die trabar sind diese Dateien http://tkinter.unpythonic.net/wiki/TkTableCalendar und https://github.com/Infinidat/infi.systray/blob/develop/src/infi/systray/traybar.py sind.

Wenn Sie dies ausführen, wird ein Symbol in der Taskleiste eines Windows-Computers mit den Optionen Add und erstellt. Klicken Sie auf die app öffnet den Kalender, kein Problem. Schließen Sie den Kalender und klicken Sie erneut auf die Add. Aber diesmal ist es nicht den Kalender öffnet und führt den folgenden Fehler

` 
Traceback (most recent call last): 
File "_ctypes/callbacks.c", line 314, in 'calling callback function' 
File "C:\Users\Koushik Naskar\AppData\Roaming\Python\Python27\site-packages\traybar.py", line 79, in WndProc 
self._message_dict[msg](hwnd, msg, wparam.value, lparam.value) 
File "C:\Users\Koushik Naskar\AppData\Roaming\Python\Python27\site-packages\traybar.py", line 276, in _command 
self._execute_menu_option(id) 
File "C:\Users\Koushik Naskar\AppData\Roaming\Python\Python27\site-packages\traybar.py", line 283, in _execute_menu_option 
menu_action(self) 
File "C:\Users\Koushik Naskar\Desktop\So\temp.py", line 11, in add 
Add(root) 
File "C:\Users\Koushik Naskar\Desktop\So\temp.py", line 7, in __init__ 
Calendar(master).pack() 
File "C:\Users\Koushik Naskar\Desktop\So\cal.py", line 66, in __init__ 
state='disabled', browsecommand=self._set_selection) 
File "C:\Python27\lib\lib-tk\tktable.py", line 118, in __init__ 
Tkinter.Widget.__init__(self, master, 'table', kw) 
File "C:\Python27\lib\lib-tk\Tkinter.py", line 2090, in __init__ 
(widgetName, self._w) + extra + self._options(cnf)) 
_tkinter.TclError: invalid command name "table" 
` 

Dieses Problem wird nur dann angezeigt, wenn ich SysTrayIcon verwenden, um mit dem Calendar .Instead von Calendar, wenn Sie einfach verwenden TkinterButton oder Label usw. dieser Fehler doesn nicht erscheinen. Außerdem kann ich das Calendar Widget normalerweise (ohne die SysTrayIcon) in einer üblichen Tkinter GUI so oft benutzen, wie ich will, kein Fehler tritt dort auf. Jetzt habe ich keine Ahnung, was hier passiert und wie ich das beheben kann. Welches Problem hat SysTrayIcon mit Calendar und warum tritt der Fehler beim ersten Mal nicht auf, wenn ich die GUI öffne? Bitte helfen Sie.

Antwort

1

TkTableCalendar benötigt das tktable-Modul, das Sie in lib-tk installiert haben (Module von Drittanbietern gehen normalerweise in lib/site-packages), wie in diesem Teil des Tracebacks angegeben.

File "C:\Python27\lib\lib-tk\tktable.py", line 118, in __init__ 
Tkinter.Widget.__init__(self, master, 'table', kw) 
File "C:\Python27\lib\lib-tk\tktable.py", line 118, in __init__ 
Tkinter.Widget.__init__(self, master, 'table', kw) 

Das tktable-Modul erfordert, dass Ihre tcl/tk-Installation über die Erweiterung tktable verfügt. Diese Erweiterung definiert das Widget 'Tabelle'. Es ist nicht Teil des Standardtcl/tk, der mit Python unter Windows installiert wird. Daher

_tkinter.TclError: invalid command name "table" 

tktable Der Quellcode (wahrscheinlich eine Mischung von TCL und c) bei SourceForge gehostet. This page sagt, dass es ist Teil der ActiveState Batterien enthalten Verteilung. Ich weiß nicht, ob die kostenlose Version von AS tcl/tk alle "Batterien" hat. Und ich weiß nicht, wie man die bereits vorhandene tcl/tk-Installation durch eine neue ersetzt. Ich persönlich würde wenn möglich eine Alternative benutzen.

+0

Warum wirft es keinen Fehler beim ersten Mal oder wenn ich das 'Kalender' Widget in einer üblichen Tkinter GUI benutze. – Eular