доступ к координатам списка переменных с помощью оператора if - PullRequest
0 голосов
/ 17 января 2012

Для этого кода Python 2.7 tkinter, если я введу «Apple» и нажму кнопку «Поиск», я должен сбросить параметры строковых переменных и связанные радиокнопки с неизвестных («?») На те, которые описывают яблоки («Хрустящие») и ("Умеренный"), но у меня проблемы с доступом к списку координат списков с помощью моего оператора if.

from Tkinter import*

class Fruit:
    def __init__(self, parent):

    # variables
    self.texture_option = StringVar()
    self.climate_option = StringVar()

    # layout
    self.myParent = parent

    self.main_frame = Frame(parent, background="light blue")
    self.main_frame.pack(expand=YES, fill=BOTH)

    texture_options = ["Soft", "Crunchy","?"]
    climate_options = ["Temperate", "Tropical","?"]

    self.texture_option.set("?")
    self.climate_option.set("?")

    self.texture_options_frame = Frame(self.main_frame, borderwidth=3, background="light blue")
    self.texture_options_frame.pack(side=TOP, expand=YES, anchor=W)
    Label(self.texture_options_frame, text="Texture:", relief=FLAT, font="bold", background="light blue").pack(side=LEFT,anchor=W)
    for option in texture_options:
        button = Radiobutton(self.texture_options_frame, text=str(option), indicatoron=0,
        value=option, padx=5, variable=self.texture_option, background="light blue")
        button.pack(side=LEFT)

    self.climate_options_frame = Frame(self.main_frame, borderwidth=3, background="light blue")
    self.climate_options_frame.pack(side=TOP, expand=YES, anchor=W)
    Label(self.climate_options_frame, text="Climate:", relief=FLAT, font="bold", background="light blue").pack(side=LEFT,anchor=W)
    for option in climate_options:
        button = Radiobutton(self.climate_options_frame, text=str(option), indicatoron=0,
        value=option, padx=5, variable=self.climate_option, background="light blue")
        button.pack(side=LEFT)

    #search button
    self.search_frame = Frame(self.main_frame, borderwidth=5, height=50, background="light blue")
    self.search_frame.pack(expand=NO)

    self.enter = Entry(self.search_frame, width=30)
    self.enter.pack(side=LEFT, expand=NO, padx=5, pady=5, ipadx=5, ipady=5)

    self.searchbutton = Button(self.search_frame, text="Search", foreground="white", background="blue",
    width=6, padx="2m", pady="1m")
    self.searchbutton.pack(side=LEFT, pady=5)
    self.searchbutton.bind("<Button-1>", self.searchbuttonclick)
    self.searchbutton.bind("<Return>", self.searchbuttonclick)


def searchbuttonclick(self,event):
    #fruit  texture  climate 
    fruit_bowl=[
    ('Apple', 'Crunchy','Temperate'),
    ('Orange', 'Soft','Tropical'),
    ('Pawpaw','Soft','Temperate')]

    if self.enter.get()==fruit_bowl[i][0]:
        self.texture_option.set(fruit_bowl[i][1])
        self.climate_option.set(fruit_bowl[i][2])


root = Tk()
root.title("Fruit Bowl")
fruit = Fruit(root)
root.mainloop()

Я хочу сказать, если окно ввода равно столбцу 0 для какой-либо данной строки в fruit_bowl, тогда для параметра текстуры устанавливается значение столбца 1 для этой строки, а для параметра климата устанавливается значение столбца 2 для этой строки, но как это сделать? Я говорю что на питоне?

Первоначально я упустил компоненты графического интерфейса этого кода, чтобы упростить вещи, но, видимо, просто все усложнил и сделал мой код нестабильным и странным. Приведенный выше код должен дать вам хорошее окно с графическим интерфейсом, но нажатие кнопки поиска ничего не дает, кроме как генерирует следующее сообщение об ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python25\Lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "F:\Python\fruit.py", line 59, in searchbuttonclick
if self.enter.get()==fruit_bowl[i][0]:
NameError: global name 'i' is not defined

Есть ли понимание списка или что-то, что я мог бы использовать, чтобы уладить это, вместо того, чтобы переписывать мой код? Это ложный пример, чтобы попытаться решить возникающие у меня проблемы с гораздо большим модулем.

Ответы [ 2 ]

4 голосов
/ 17 января 2012

Для этого следует использовать словарь:

fruits = {'Apple': ['Crunchy', 'Temperate'],
          'Orange': ['Soft', 'Tropical'],
          'Pawpaw': ['Soft', 'Temperate']}
print 'Apples are {}.'.format(' and '.join(fruits['Apple']))

Редактировать: см. Также документацию к стандартной библиотеке и официальный учебник

Редактирование # 2: Конечно, вы можете также установить переменные следующим образом:

self.texture_option.set(fruits['Apple'][0])
self.climate_option.set(fruits['Apple'][1])

Вы также можете написать что-то вроде этого:

fruit = self.enter.get()
self.texture_option.set(fruits.get(fruit, ['?', '?'])[0])
self.climate_option.set(fruits.get(fruit, ['?', '?'])[0])

Где ['?', '?'] используется как опция,если плод не известен вашей программе.

2 голосов
/ 17 января 2012

Ваш пример кода не очень согласован.Например, вы определяете объект StingVar, что имело бы смысл, если бы вы связали объект с виджетом tkinter, таким как виджет Entry:

self.entry_var = StringVar()
self.enter = Entry(root, width = 30, textvariable = self.entry_var)
selection = self.entry_var.get()

, учитывая, что я опущу ваш головной фрагменти сделайте это следующим образом:

self.enter = Entry(root, width=30)
self.enter.pack(side=LEFT, expand=NO)

#fruit  texture  climate 
fruit_bowl={'apple': ('Crunchy','Temperate'),
            'orange': ('Soft','Tropical'),
            'pawpaw': ('Soft','Temperate')}

selection = self.enter.get()
try:
   self.texture_option = fruit_bowl[selection.lower()][0]
   self.climate_option = fruit_bowl[selection.lower()][1]
   self.fruit_option = selection.capitalize()
except KeyError:
    print "%s not in fruit-bowl" % selection

Если вы хотите сохранить свой код таким, какой он есть, вам нужно будет сделать что-то вроде следующего:

for fruit in fruit_bowl:
    i = fruit_bowl.index(fruit)
    if self.enter.get()==fruit_bowl[i][0]:
        self.texture_option.set(fruit_bowl[i][1])
        self.climate_option.set(fruit_bowl[i][2])

Где вы определили переменную i?Я не вижу определения, и поэтому не могу Python.Чтобы исправить ситуацию, я сделал итерацию над вашим fruit_bowl и присвоил значение фактического индекса кортежа в списке переменной `i.Это единственные две строки, которые вы должны добавить (кроме добавленных обозначений следующих строк), чтобы ваш код работал.Это не очень элегантно, но, может быть, вы можете узнать что-то из этого.

альтернативно, вы также можете подумать над этим:

for i in xrange(len(fruit_bowl)):
    if self.enter.get()==fruit_bowl[i][0]:
        self.texture_option.set(fruit_bowl[i][1])
        self.climate_option.set(fruit_bowl[i][2])

Если у вас есть дополнительные вопросы, просто оставьте комментарий, и яобновит мой ответ соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...