2017-02-19 23 views
0

私は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" 

エラーは、コマンドに参照されている:私は、Python 3でそれを実行しようとしたとき

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

は、それが完全に働いたが、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://stackoverflow.com/help/mcve) –

答えて

1

あなたは、メニューボタンウィジェットを使用することになっている方法は、それにメニューを取り付けることです。 Python 3のTkinterでは、デフォルトでこれが行われているようですが、2.7では、そうではありませんでした。

コードには、他にも奇妙なことがたくさんあります(実際にはメニューボタンやメニューを作成していないようです)。その奇妙なことは、あなた自身のコードですか?またlog_in_pageset_menu_buttonメソッドで直接呼び出します。これは優先順位の "驚くべき"分布ですが、そうではありません。)代わりに、コードをもっと簡単に保つことに固執します。

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 

少なくとも驚くほど間違っているとは限りません。

関連する問題