O.I
O.I

Reputation: 1

python 2.7 Tkinter tcl error

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

Answers (1)

Donal Fellows
Donal Fellows

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

Related Questions