我之前在2.7中使用tkinter接口构建了一个程序我现在正试图将它合并到一个3.5.2程序中但是我遇到了很多错误而且我不确定它是否是由于包更改在tkinter中为Python3.5.2。主要问题是下面的下拉菜单将是我的2.7版本以及3.5.2的错误和我尝试使用错误的解决方案。
Tkinter代码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解决方案一:
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()
解决方案一个错误:
出现了第一个问题menu = apply(OptionMenu, (root, var) + tuple(OPTIONS))
声明NameError:未定义名称“apply”。我的第一个想法是删除它并继续思考它可能不需要在python 3.5.2中,然后它告诉我我无法运行代码“menu.pack(SIDE = TOP,anchor = W)”,错误代码:
AttributeError: 'tuple' object has no attribute 'pack'
3.5.2解决方案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()
使用解决方案二我能够通过菜单错误,但现在收到此错误消息,我只是丢失了为什么这一切都在2.7没有问题但但现在拒绝在3.5.2上做任何事情/ p>
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
提前感谢您的任何帮助或反馈。
答案 0 :(得分:1)
除了导入tkinter库的方法之外,代码中唯一适应的是选项菜单:
原始python2代码
menu = apply(OptionMenu, (root, var) + tuple(OPTIONS))
在python3中运行的代码
menu = OptionMenu(root, var, *OPTIONS)
(这也适用于python2)