python 2.7 Tkinter tcl错误

问题描述:

我正在使用python 2.7,并且在尝试执行我的代码时遇到了一个奇怪的错误。python 2.7 Tkinter tcl错误

Traceback (most recent call last): 
    File "E:/cyber/PYTHON/client/main.py", line 16, in <module> 
    main() 
    File "E:/cyber/PYTHON/client/main.py", line 9, in main 
    menubutton_auth = auth_page.set_menu_button(root) 
    File "E:\cyber\PYTHON\client\auth_page.py", line 15, in set_menu_button 
    menubutton.menu.add_command(label=LOG_IN, command=self.log_in_page) 
    File "C:\Heights\PortableApps\PortablePython2.7.6.1\App\lib\lib-tk\Tkinter.py", line 2683, in add_command 
    self.add('command', cnf or kw) 
    File "C:\Heights\PortableApps\PortablePython2.7.6.1\App\lib\lib-tk\Tkinter.py", line 2674, in add 
    self._options(cnf, kw)) 
_tkinter.TclError: invalid command name ".36805008.36805608" 

错误是参照下面的命令:

menubutton.menu.add_command(label=LOG_IN, command=self.log_in_page) 

,当我试图使用python 3它完美地工作,但与Python 2.7它提出了这个错误执行它。有什么我做错了这条线?

谢谢。

代码:

from pages_menu import * 
from Tkinter import * 
import tkMessageBox 


class AuthPage(Page): 
    def __init__(self, root): 
     Page.__init__(self, root) 
     self.root = root 
     self.socket = None 

    def set_menu_button(self, root): 
     menubutton = super(AuthPage, self).set_menu_button(root) 
     self.log_in_page() 
     menubutton.menu.add_command(label=LOG_IN, command=self.log_in_page) 
     menubutton.menu.add_command(label=REGISTER, command=self.register_page) 
     return menubutton 

    def log_in_page(self): 
     self.clear_screen(self.root) 
     self.add_elements(self.root, LOG_IN) 
     text = Label(self.root, bd=0, font=self.font1, text=LOG_IN_TEXT, pady=100) 
     text.pack() 
     self.display_structure() 
     l = Label(self.root, pady=20) 
     l.pack() 
     button = Button(self.root, bg=ROYAL_BLUE, activebackground=ROYAL_BLUE, 
        font=self.font1, fg=WHITE, text=LOG_IN, 
        command=self.log_in_user) 
     button.pack() 

    def register_page(self): 
     self.clear_screen(self.root) 
     self.add_elements(self.root, REGISTER) 
     text = Label(self.root, bd=0, font=self.font1, text=REGISTER_TEXT, pady=40) 
     text.pack() 
     self.display_structure() 
     global entry_email 
     label_email = Label(self.root, fg=CHOCOLATE, bd=0, font=self.font1, text=EMAIL, pady=20) 
     label_email.pack() 
     entry_email = Entry(self.root, bg=GREEN, bd=5, font=self.font1, exportselection=0, fg=RED) 
     entry_email.pack() 
     l = Label(self.root, pady=20) 
     l.pack() 
     button = Button(self.root, bg=ROYAL_BLUE, activebackground=ROYAL_BLUE, 
        font=self.font1, fg=WHITE, text=LOG_IN, 
        command=self.register_user) 
     button.pack() 

    def display_structure(self): 
     global entry_username 
     global entry_password 
     label_username = Label(self.root, fg=CHOCOLATE, bd=0, font=self.font1, text=USERNAME, pady=20) 
     label_username.pack() 
     entry_username = Entry(self.root, bg=GREEN, bd=5, font=self.font1, exportselection=0, fg=RED) 
     entry_username.pack() 
     label_password = Label(self.root, fg=CHOCOLATE, bd=0, font=self.font1, text=PASSWORD, pady=20) 
     label_password.pack() 
     entry_password = Entry(self.root, bg=GREEN, bd=5, font=self.font1, exportselection=0, fg=RED, show="*") 
     entry_password.pack() 

    def log_in_user(self): 
     global entry_username 
     global entry_password 
     request = "database#login#" + entry_username.get() + "#" + entry_password.get() 
     self.make_socket() 
     self.socket.send(request) 
     answer = self.socket.recv(CHECK_BUFFER) 
     if answer == OK: 
      save_username(entry_username.get()) 
      self.enter() 
     else: 
      tkMessageBox.showwarning("INVALID", "Invalid username or password") 

    def register_user(self): 
     global entry_username 
     global entry_password 
     global entry_email 
     request = "database#register#" + entry_username.get() + "#" + entry_password.get() + "#" + entry_email.get() 
     self.make_socket() 
     self.socket.send(request) 
     answer = self.socket.recv(CHECK_BUFFER) 
     if answer == OK: 
      save_username(entry_username.get()) 
      self.enter() 
     else: 
      tkMessageBox.showwarning("INVALID", "Those username or password already exists") 

    def enter(self): 
     self.clear_all_screen(self.root) 
     menubutton = super(AuthPage, self).set_menu_button(self.root) 
     add_menu(self.root, menubutton) 
     home_page() 

    def make_socket(self): 
     self.socket = socket.socket() 
     self.socket.connect((SERVER, PORT)) 
+1

我想我们需要知道'Page.set_menu_button'是做什么的。请删除任何不相关的代码,并制作一个[最小,完整和可验证示例](http://*.com/help/mcve) –

你应该使用Menubutton小部件的方法是通过菜单附加到它。看起来,在Python 3 Tkinter中,默认情况下这是为你完成的,让你摆脱sl,,但在2.7中它不是。

你的代码中还有很多其他奇怪的东西(比如你似乎实际上并没有创建menubutton或菜单的方式,并且可能会通过递归调用来做各种其他奇怪的事情你自己的代码?另外,你直接用set_menu_button方法调用log_in_page方法,这是一个“令人惊讶”的优先级分配;不这样做。)相反,坚持保持代码更简单,可能是这样的:

def set_menu_button(self, root): 
     # You might want to choose another label ;-) 
     menubutton = Menubutton(root, "some label") 
     menu = Menu(menubutton) 
     menubutton.config(menu=menubutton) 
     menu.add_command(label=LOG_IN, command=self.log_in_page) 
     menu.add_command(label=REGISTER, command=self.register_page) 
     return menubutton 

这至少看起来并不出人意料的错误。