2017-01-30 9 views
-2

Ich versuche derzeit, eine GUI-Anwendung in Tkinter zu erstellen, die Benutzereingaben von einem Eintrag übernimmt und ein Dropdown-Menü submittiert. Das Probelm ist, dass der OptionMenu werfen hält:Python TypeError bei Verwendung von OptionMenu 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' 

wenn ich getMeal in ersetzen:

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

mit list = [1,2,3,4] oder jede andere Liste es funktioniert gut. warum ist das?

unten ist das vollständige Programm:

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

Haben Sie sich vergewissert, dass 'getMeal' enthält, was Sie davon aus, es enthält? Der Fehler bedeutet, dass es leer ist. –

+0

"getMeal" ausgeben, Sie bekommen diesen Fehler, weil er leer ist. –

+0

Bitte beachten Sie, dass die Größe des Beispiels reduziert werden muss. Wenn das Problem mit einem 'OptionMenu' auftritt, können Sie wahrscheinlich alle anderen Widgets und' StringVar's entfernen, und Sie können die Argumente, die Sie an 'OptionMenu' übergeben, fest codieren. –

Antwort

-1

Wurf entfernt Lambda-Funktion nach dem Befehl benötigt wird, wenn die Tasten Erstellen von

Verwandte Themen