2017-01-04 47 views
0

我以前用tkinter接口在2.7中创建了一个程序我现在试图将它合并到3.5.2程序中,但是我有很多错误,我不确定是否这是由于Python3.5.2的tkinter中的软件包更改所致。主要的问题是要做下面的下拉菜单将是我的2.7版本以及错误的3.5.2和解决方案我尝试了错误。Python 3.5 tkinter下拉菜单

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,锚= 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上做任何事情:

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

对于最后一个,它应该是小写'side ='。不是'SIDE ='。 – Lafexlos

+0

关于[apply](http://python3porting.com/differences.html#apply)。我没有时间来形成完整的答案,所以我希望别人会这样做。我只是在投入一些资源。 – Lafexlos

+0

@Lafexlos谢谢我现在正在运行,但快速问题我的菜单栏正在占用整个区域,并且下拉菜单不会用新行分隔,关于如何将菜单缩小为字符串长度的任何想法'菜单' –

回答

1

中,除了进口的Tkinter库的方式的代码来适应的唯一的事情是关于选项菜单位:

原python2代码

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

代码工作在python3

menu = OptionMenu(root, var, *OPTIONS)(这也适用于python2)