L.C
L.C

Reputation: 57

Python 3.5 tkinter drop down menu

I previously built a program in 2.7 with a tkinter interface I'm now trying to incorporate it into a 3.5.2 program but I'm having a lot of errors and I'm not sure if it is due to package changes within tkinter for Python3.5.2. The main problem is to do with the drop down menu below will be my 2.7 version along with the error for 3.5.2 and a solution i tried with the error.

Tkinter code Python 2.7:

 from Tkinter import *
import tkMessageBox


OPTIONS = [
    "Homepage",
    "Instructions",
    "Contact Page"
]


root = Tk()
root.title("Tittle")
root.geometry('700x300')

var = StringVar(root)
var.set("Menu")
#var.set(OPTIONS[0])

menu = apply(OptionMenu, (root, var) + tuple(OPTIONS))
menu.pack(side=TOP, anchor=W)

#Set the separator between the menu and the buttons
separator = Frame(height=2, bd=1, relief=SUNKEN)
separator.pack(fill=X, padx=1, pady=20)
top = Frame(root)
center = Frame(root)
bottom = Frame(root)
top.pack(side=TOP)
center.pack(side=TOP)
bottom.pack(side=BOTTOM, fill=BOTH, expand=True)

#Method to change the GUI when an option from the Menu is selected
def change_age(*args):
    if var.get()=="Homepage":
        b1.pack(in_=center, side=LEFT)
        b2.pack(in_=center, side=LEFT)
        b3.pack(in_=center, side=LEFT)
        b4.pack(in_=center, side=LEFT)
    if var.get()=="Instructions":
        L1.pack(in_=center, side=LEFT)


var.trace('w', change_age)

# create the widgets for the top part of the GUI
b1 = Button(root, text="Database Parser", height=5)
b1.place(x=170, y=500)
b2 = Button(root, text="Web Crawler", height=5)
b3 = Button(root, text="Password Generator", height=5)
b4 = Button(root, text="Dictionary Attack", height=5)

    #Instructions labels
L1 = Label(root, text="Instructions:\nHere you can write all your instructions")
L2 = Label(root, text="Contact Page:\nHere you can write all your contact information")


b1.pack(in_=center, side=LEFT)
b2.pack(in_=center, side=LEFT)
b3.pack(in_=center, side=LEFT)
b4.pack(in_=center, side=LEFT)

root.mainloop()

3.5.2 Solution One:

from tkinter import *
from tkinter.filedialog import askopenfilenames

import sys


OPTIONS = [
    'HOME'
    'INSTRUCTIONS'
]


root = Tk()
root.title('Title')
root.geometry('700x300')



 var = StringVar(root)
 var.set("Menu")


menu = apply(OptionMenu, (root, var) + tuple(OPTIONS))
menu.pack(side=TOP, anchor=W)



separator = Frame(height=2, bd=1, relief=SUNKEN)
separator.pack()

top = Frame(root)
center = Frame(root)
bottom = Frame(root)
top.pack(side=TOP)
center.pack(side=TOP)
bottom.pack(side=BOTTOM, fill=BOTH, expand=True)


#Method changes GUI when an option from menu is selected
"""
def change_layout(*args):
    if var.get()=='Homepage':
        b1.pack(in_=center, side=LEFT)
        b2.pack(in_=center, side=LEFT)
        b3.pack(in_=center, side=LEFT)
    if var.get()=='Instructions':
        b1.pack_forget()
        b2.pack_forget()
        b3.pack_forget()
"""


def load_file():
    fname = askopenfilenames(filetypes= (("Text Files", ".txt"),
                            ("HTML Files", "*.html;*.htm"),
                                ("All Files", "*.*")))

    if fname:
        try:
            print('Files loaded')
        except OSError as Error:
            print('Files encountered error while loading')




# widgets for the top part of the GUI
b1 = Button(root, text='Select Files', height=5, command=load_file)
b1.place(x=170, y=500)
b2 = Button(root, text='Run Program', height=5)
b3 = Button(root, text='Save Results', height=5)



b1.pack(in_=center, SIDE=LEFT)
b2.pack(in_=center, SIDE=LEFT)
b3.pack(in_=center, SIDE=LEFT)



#Instructions - TODO Later date


root.mainloop()

Solution One Errors: The first problem occurs with

menu = apply(OptionMenu, (root, var) + tuple(OPTIONS))

stating NameError: name 'apply' is not defined. My first thought was to remove it and carry on thinking it may not be needed in python 3.5.2, then it tells me I can not run the code "menu.pack(SIDE=TOP, anchor=W)" with error code:

AttributeError: 'tuple' object has no attribute 'pack'

3.5.2 Solution 2:

from tkinter import *
from tkinter.filedialog import askopenfilenames

import sys


class drop_down_menu(OptionMenu):
    def __init__(self, master, menu, *options):

        self.var = StringVar(master)
        self.var.set('Menu')
        OptionMenu.__init__(self, master, self.var, *options)
        self.init_ui()

    def init_ui(self):

        self.master.title('Test')
        self.pack(fill=BOTH, expand=1)


OPTIONS = [
    'HOME'
    'INSTRUCTIONS'
]


root = Tk()
root.title('Title')
root.geometry('700x300')

menu = drop_down_menu(root, 'Menu', OPTIONS)
menu.place



separator = Frame(height=2, bd=1, relief=SUNKEN)
separator.pack()

top = Frame(root)
center = Frame(root)
bottom = Frame(root)
top.pack(side=TOP)
center.pack(side=TOP)
bottom.pack(side=BOTTOM, fill=BOTH, expand=True)


#Method changes GUI when an option from menu is selected
"""
def change_layout(*args):
    if var.get()=='Homepage':
        b1.pack(in_=center, side=LEFT)
        b2.pack(in_=center, side=LEFT)
        b3.pack(in_=center, side=LEFT)
    if var.get()=='Instructions':
        b1.pack_forget()
        b2.pack_forget()
        b3.pack_forget()
"""


def load_file():
    fname = askopenfilenames(filetypes= (("Text Files", ".txt"),
                            ("HTML Files", "*.html;*.htm"),
                                ("All Files", "*.*")))

    if fname:
        try:
            print('Files loaded')
        except OSError as Error:
            print('Files encountered error while loading')




# widgets for the top part of the GUI
b1 = Button(root, text='Select Files', height=5, command=load_file)
b1.place(x=170, y=500)
b2 = Button(root, text='Run Program', height=5)
b3 = Button(root, text='Save Results', height=5)



b1.pack(in_=center, SIDE=LEFT)
b2.pack(in_=center, SIDE=LEFT)
b3.pack(in_=center, SIDE=LEFT)



#Instructions - TODO Later date


root.mainloop()

Using Solution two i was able to get passed the menu errors but now receive this error messages and I'm just lost as to why this all worked without issue on 2.7 but now refuses to do anything on 3.5.2:

Traceback (most recent call last):
  File "C:/Users/Lewis Collins/PycharmProjects/Home.py", line 86, in <module>
    b1.pack(in_=center, SIDE=LEFT)
  File "C:\Users\Lewis Collins\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1991, in pack_configure
    + self._options(cnf, kw))
_tkinter.TclError: bad option "-SIDE": must be -after, -anchor, -before, -expand, -fill, -in, -ipadx, -ipady, -padx, -pady, or -side

Thanks in advance for any help or feedback.

Upvotes: 0

Views: 1582

Answers (1)

j_4321
j_4321

Reputation: 16169

The only thing to adapt in the code in addition to the way to import tkinter libraries is the bit about the option menu:

original python2 code

menu = apply(OptionMenu, (root, var) + tuple(OPTIONS))

code working in python3

menu = OptionMenu(root, var, *OPTIONS) (this also works in python2)

Upvotes: 1

Related Questions