2017-02-19 9 views
0

Ich benutze Python 2.7 und ich habe einen seltsamen Fehler beim Versuch, meinen Code auszuführen.Python 2.7 Tkinter Tcl Fehler

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" 

Der Fehler wird auf den Befehl verwiesen:

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

als ich versuchte, es mit Python ausführen 3 es perfekt funktioniert, aber mit Python 2.7 es hebt diesen Fehler. Es gibt etwas, das ich mit dieser Linie falsch mache?

Danke.

Der Code:

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

Ich denke, wir müssen wissen, was 'Page.set_menu_button' tut. Bitte entfernen Sie nicht verwandten Code und erstellen Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) –

Antwort

1

Die Art und Weise sollte bist ist das Menübutton Widget verwenden, indem ein Menü, um sie zu befestigen. Es scheint, dass das im Python 3 Tkinter standardmäßig für dich erledigt wird, damit du schlampig durchkommen kannst, aber in 2.7 war es das nicht.

Es gibt eine Reihe anderer seltsamer Dinge in Ihrem Code (wie zum Beispiel die Art, wie Sie den Menubutton oder das Menü überhaupt nicht zu erstellen scheinen und möglicherweise alle möglichen anderen seltsamen Dinge mit diesem rekursiven Aufruf an Sie rufen auch die log_in_page direkt in der set_menu_button Methode, die eine "überraschende" Verteilung von Prioritäten ist, tun Sie das nicht.) Stattdessen halten Sie den Code viel einfacher, wahrscheinlich in etwa so:

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 

Das sieht zumindest nicht überraschend falsch aus.