Привязка Tkinter Combobox <> вызывает KeyError: '' при инициализацииPython

Программы на Python
Ответить
Anonymous
 Привязка Tkinter Combobox <> вызывает KeyError: '' при инициализации

Сообщение Anonymous »

Я пытаюсь написать программу для расчетов размера провода, размера предохранителя и номинальной силы тока.
У меня есть несколько кадров, каждый из которых выполняет свои конкретные расчеты. Проблема, с которой я столкнулся, связана с фреймом преобразования единиц измерения. Целью здесь является преобразование из AWG в мм2 или наоборот.
Когда я выбираю значение в поле со списком (соответствующее единице измерения, из которой я хочу преобразовать), я хочу, чтобы преобразованное значение другой единицы отображалось в метке результата ниже.
Вот что я пробовал:

Код: Выделить всё

import tkinter as tk
from tkinter import ttk

options = {'padx': 10, 'pady': 5}
uitk_options = {'borderwidth': 5, 'relief': 'sunken'}

class UnitFrame(tk.Frame):
def __init__(self, parent):
super().__init__(parent)

self.awg_dict = {'20': '0.50', '18': '0.75', '16': '1.50', '14': '2.50', '12': '4.00', '10': '6.00', '8': '10.00',
'6': '13.30', '4': '21.10', '2': '33.60', '0': '53.50', '00': '67.40', '000': '85.00', '0000': '107.20'}
self.mm2_dict = {v: k for k, v in self.awg_dict.items()}

#AWG to mm2
self.awg_label = ttk.Label(self, text = 'AWG: ')
self.awg_label.grid(column = 0, row = 0, **options)

self.sel_awg = tk.StringVar()
self.awg_comb = ttk.Combobox(self, textvariable = self.sel_awg)
self.awg_comb['values'] = list(self.awg_dict.keys()); self.awg_comb['state'] = 'readonly'
self.awg_comb.bind('', self.calculate(self.awg_dict, self.sel_awg.get()))
self.awg_comb.grid(column = 1, row = 0, **options)

self.awg_res_label = ttk.Label(self, text = 'MM2: ')
self.awg_res_label.grid(column = 0, row = 1, **options)

self.awg_uitk_label = ttk.Label(self, **uitk_options)
self.awg_uitk_label.grid(column = 1, row = 1, **options)

#mm2 to AWG
self.mm2_label = ttk.Label(self, text = 'MM2: ')
self.mm2_label.grid(column = 2, row = 0, **options)

self.sel_mm2 = tk.StringVar()
self.mm2_comb = ttk.Combobox(self, textvariable = self.sel_mm2)
self.mm2_comb['values'] = list(self.mm2_dict.keys()); self.mm2_comb['state'] = 'readonly'
self.mm2_comb.bind('', self.calculate(self.mm2_dict, self.sel_mm2.get()))
self.mm2_comb.grid(column = 3, row = 0, **options)

self.mm2_res_label = ttk.Label(self, text = 'AWG: ')
self.mm2_res_label.grid(column = 2, row = 1, **options)

self.mm2_uitk_label = ttk.Label(self, **uitk_options)
self.mm2_uitk_label.grid(column = 3, row = 1, **options)

self.grid(row = 0, column = 0, sticky = 'nsew')

def calculate(self, dict_, key_):
self.val = dict_[key_]

if dict_ == self.awg_dict:
self.awg_uitk_label.configure(text = self.val)
else:
self.mm2_uitk_label.configure(text = self.val)

class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)

self.title("Wiresize calculator")
self.resizable(False, False)

if __name__ == "__main__":
app = App()
unit_frame = UnitFrame(app)

app.mainloop()

Итак, у меня есть 2 поля со списком и 2 словаря, в зависимости от того, какое преобразование я хочу выполнить.
Где «ключи» — это значение данной единицы измерения, а «значения» — соответствующее значение в другой единице измерения.
Затем я определил функцию с именем Calculate, которая принимает словарь, который я хочу использовать, и заданное значение, которое я хочу преобразовать в качестве аргументов. Аргумент key_ определяется текстовой переменной, связанной с полем со списком. В функции я настраиваю текст метки, которая должна отображать результат.
эту функцию я привязываю к событию ''.
С помощью этого кода я получаю KeyError: ' ' при запуске сценария, поэтому я предполагаю, что, поскольку в этот момент в поле со списком ничего не выбрано, аргумент key_ имеет пустую строку, поэтому Python не может найти этот ключ в словаре, потому что он не существует.
В обзоре моего вопроса мне было указано, что моя проблема вызвана тем, что моя привязка напрямую вызывает функцию self.calculate, но я не знаю, как передать необходимые значения аргументам, когда я просто вызываю ссылку.

Код: Выделить всё

self.awg_comb.bind('', self.calculate(self.awg_dict,
self.sel_awg.get()))
Думаю, мою проблему можно решить с помощью условного оператора в функции self.calculate, который проверяет значение текстовой переменной, связанной с радиокнопками, чтобы определить, какое преобразование я хочу сделать, поэтому нет необходимости передавать аргументы, но ради удобства использования я бы, как упоминалось выше, хотел бы, чтобы программа сразу же показывала преобразованное значение в метке результата, когда я выбираю значение для преобразования в поле со списком.
Может кто-нибудь здесь указать меня в правильном направлении для решения?
p.s. это мой первый вопрос здесь, дайте мне знать, если и как я могу лучше сформулировать свои вопросы!

Подробнее здесь: https://stackoverflow.com/questions/798 ... tializatio
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»