Reputation: 1
I'm using python 2.7 and i got a strange error while trying to execute my code.
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"
The error is referenced to the command:
menubutton.menu.add_command(label=LOG_IN, command=self.log_in_page)
when i tried to execute it with python 3 it worked perfectly but with python 2.7 it raises this error. There is something that I'm doing wrong with this line?
Thanks.
The 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))
Upvotes: 0
Views: 737
Reputation: 137757
The way you're supposed to use the Menubutton widget is by attaching a Menu to it. It seems that in the Python 3 Tkinter this is done for you by default, letting you get away with being sloppy, but in 2.7 it wasn't.
There's a number of other weird things in your code (such as the way you don't seem to actually ever create the menubutton or menu at all, and might be doing all sorts of other weird stuff with that recursive call to your own code? Also, you call the log_in_page
directly in the set_menu_button
method, which is a “surprising” distribution of priorities; don't do that.) Instead, stick to keeping the code much simpler, probably something like this:
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
That at least doesn't look surprisingly wrong.
Upvotes: 1