2017-01-04 16 views
0

私は以前にtkinterインターフェースを使って2.7でプログラムを構築しましたが、今は3.5.2のプログラムに組み込もうとしていますが、多くのエラーがあります。これは、Python3.5.2のtkinter内のパッケージの変更によるものです。主な問題は、下のドロップダウンメニューを使用して3.5.2のエラーと解決策と一緒に私の2.7バージョンとなり、エラーと一緒に試してみることです。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() 

ソリューションの一つのエラー: 最初の問題は

NameErrorを述べ
menu = apply(OptionMenu, (root, var) + tuple(OPTIONS)) 

で発生します。名前'適用'は定義されていません。私の最初の考えはそれを削除し、Python 3.5.2では必要でないかもしれないと考えていましたが、 "menu.pack(SIDE = TOP、anchor = W)"コードをエラーコードで実行することはできません。

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

3.5.2解決策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

[適用](http://python3porting.com/differences.html#apply)について私は完全な答えを形成する時間がないので、他の誰かがそれをすることを願っています。私はいくつかのリソースをドロップしています。 – Lafexlos

+0

@Lafexlosありがとう、私は今すぐ実行しているが、私のメニューバーは全領域を占めていて、ドロップダウンは新しい行で分かれていない、文字列 'Menu'の長さにメニューを縮小する方法 –

答えて

1

Tkinterのライブラリをインポートする方法に加えて、コードに適応する唯一のものは、あるオプションメニューについて少し:

元python2コード

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

コードが働いpython3で

menu = OptionMenu(root, var, *OPTIONS)(これもpython2で動作します)

関連する問題