2017-01-30 86 views
-2

我目前一直在嘗試在Tkinter中構建一個GUI應用程序,該應用程序從一個條目接收用戶輸入並從屬於一個下拉菜單。在萬阿英,蔣達清是,OptionMenu不斷拋出:python使用OptionMenu的TypeError Tkinter

Traceback (most recent call last): 
    File "C:/Python34/food2GUIree.py", line 70, in <module> 
    mealOneButton = Button(root, text = "query database", command = GetEntry(mealOneString)) 
    File "C:/Python34/food2GUIree.py", line 68, in GetEntry 
    meal = OptionMenu(root, '', *getMeal).pack() 
TypeError: __init__() missing 1 required positional argument: 'value' 

當我更換getMeal在:

def GetEntry(x): 
    formatted = x.get().split()##gets the entry and forms a list 
    getMeal = CsvLoadSearch(u, formatted) 
    meal = OptionMenu(root, '', *getMeal).pack() 

與列表= [1,2,3,4]或任何其他列表,它工作正常。爲什麼是這樣?

波紋管是完整的程序:

from tkinter import * 
from tkinter import ttk 
import csv 
import os 

u = "C:\\Users\\luke daniels\\Documents\\fooddata.csv" 

    """ 
    Loads csv and compares elements from foodList with current row. 
    returns a list of rows that match elements in foodList. 
    """ 
def CsvLoadSearch(u, foodList): 
    results = [] 
    inputfile = open(u)    
    for row in csv.reader(inputfile): 
     for food in foodList: 
      if food in row[0]: 
       results.append(row[0]) 
       ##print(row) 
    return results  

root = Tk() 
root.title("MacroCalc")  

caloriesAim = StringVar() 
protien = StringVar() 
fat = StringVar() 
carbs = StringVar()  

mealOneString = StringVar() 
mealTwoString = StringVar() 
mealThreeString = StringVar() 
mealFourString = StringVar() 
mealFiveString = StringVar() 
mealSixString = StringVar() 

mealOneKeyword = Entry(root, textvariable = mealOneString) 
mealTwoKeyword = Entry(root, textvariable = mealTwoString) 
mealThreeKeyword = Entry(root, textvariable = mealThreeString) 
mealFourKeyword = Entry(root, textvariable = mealFourString) 
mealFiveKeyword = Entry(root, textvariable = mealFiveString) 
mealSixKeyword = Entry(root, textvariable = mealSixString) 

mealLabel = Label(root,text = "meals") 
mealLabel.config(font=("Courier", 30)) 
mealLabel.pack() 
mealLone = Label(root,text = "meal one") 
mealLtwo = Label(root,text = "meal two") 
mealLthree = Label(root,text = "meal three") 
mealLfour = Label(root,text = "meal four") 
mealLfive = Label(root,text = "meal five") 
mealLsix = Label(root,text = "meal six")  

caloriesLabel = Label(root,text = "calories needed").pack() 
calories = Text(root, height = 1, width = 10).pack() 
protienLabel= Label(root,text = "protien ratio").pack() 
protien = Text(root, height = 1, width = 4).pack() 
carbsLabel = Label(root,text = "carbohydrate ratio").pack() 
carbs = Text(root, height = 1, width = 4).pack() 
fatsLabel = Label(root,text = "fats ratio").pack() 
fats = Text(root, height = 1, width = 4).pack() 

displayText = Text(root).pack(side = RIGHT) 

def GetEntry(x): 
    formatted = x.get().split()##gets the entry and forms a list 
    getMeal = CsvLoadSearch(u, formatted) 
    meal = OptionMenu(root, '', *getMeal).pack()   

mealOneButton = Button(root, text = "query database", command = GetEntry(mealOneString)) 
mealTwoButton = Button(root, text = "query database", command = GetEntry(mealTwoString)) 
mealThreeButton = Button(root, text = "query database", command = GetEntry(mealThreeString)) 
mealFourButton = Button(root, text = "query database", command = GetEntry(mealFourString)) 
mealFiveButton = Button(root, text = "query database", command = GetEntry(mealFiveString)) 
mealSixButton = Button(root, text = "query database", command = GetEntry(mealSixString))  

mealButtons = [mealOneButton, mealTwoButton, mealThreeButton, mealFourButton, mealFiveButton, mealSixButton] 
mealKeywords = [mealOneKeyword, mealTwoKeyword, mealThreeKeyword, mealFourKeyword, mealFiveKeyword, mealSixKeyword] 
mealLabels = [mealLone, mealLtwo, mealLthree, mealLfour, mealLfive, mealLsix] 
##meals = [mealOne, mealTwo, mealThree, mealFour, mealFive, mealSix] 

##packs the drop downs and respective lables 
i = 0 
while i < len(mealLabels): 
    mealLabels[i].pack() 
    mealKeywords[i].pack() 
    mealButtons[i].pack() 
    ##meal.pack() 
    i = i + 1  

root.mainloop() 
+0

是否已確認'getMeal'包含你假定它包含的內容的按鈕時,命令後需要lambda函數?錯誤意味着它是空的。 –

+0

打印'getMeal',你得到那個錯誤,因爲它是空的。 –

+0

請考慮減少示例的大小。如果問題出在一個'OptionMenu'上,你可能會刪除所有其他的小部件和'StringVar's,並且你可以硬編碼你傳給'OptionMenu'的參數。 –

回答