Форум сайта python.su
Всем добрый день, продолжаю изучать python и вот появилось ощущение, что можно оптимизировать код, но не могу сообразить как. Подскажите. Исходные данные:
создаю окно для ввода данных, чтобы потом их передать в функцию расчета (лабораторные работы по теории массового обслуживания)
кусок кода
c1 = StringVar() c2 = StringVar() c3 = StringVar() c1_label = Label(text="Затраты на рабочее место:") c2_label = Label(text="Затраты на з/п контролера ОТК:") c3_label = Label(text="Затраты на простой контролера ОТК:") c1_label.grid(sticky="w") c2_label.grid(sticky="w") c3_label.grid(sticky="w") c1_entry = Entry(textvariable=c1) c2_entry = Entry(textvariable=c2) c3_entry = Entry(textvariable=c3) c1.set(500) c2.set(7500) c3.set(7500) c1_entry.grid(row=3, column=1) c2_entry.grid(row=4, column=1) c3_entry.grid(row=5, column=1)
Отредактировано winmasta (Ноя. 16, 2017 13:08:24)
Офлайн
както так: http://python.su/forum/topic/32446/?page=1#post-177585
там пример для pyqt но сам принцип одинаков, создавать Entry и Label в цикле и помещать их в списки или словари вместо связывания с конкретной переменной.
winmastaесли вы про текст который получаете из Entry то его нужно превратьть в int
PS и попутно вопрос, как в tkinter передавать не StringVar, а IntVar
value = c1_entry.get() int_val = IntVar() int_val.set(value)
[code python][/code]
Офлайн
PEHDOMЕсли к примеру мы имеем
както так: http://python.su/forum/topic/32446/?page=1#post-177585там пример для pyqt но сам принцип одинаков, создавать Entry и Label в цикле и помещать их в списки или словари вместо связывания с конкретной переменной.
def window(*args): for arg in args: ... window(c1, c2, c3)
Офлайн
winmastaчтото ничего не поинимаю, что значит передать “не через текст”? может приведете простенький пример чтобы было понятнее?
Ну а как например float передать не через текст, какие вообще там типы есть ? Я никак не смог найти описание.
winmastaа никак, да и вобщемто не факт что оно вам нужно . Поэтоэтому вам нужно или заранее знать название полей и передавать списком, или передавать словарь. но словарь неупорядоченная структура поэтом каждый раз при вызове порядок полей будет разный, что неимоверно раздражает. Есть конечно OrderedDict , но его нельзя всунуть в **kwargs, он тогда превратиться в простой словарь, так что его нужно передавать весь целиком.
а вот как в этой функции сказать, что аргумент есть переменная, а потом часть названия переменной я не понимаю.
from tkinter import * from collections import OrderedDict class MyWindow: def __init__(self, dct): self.entries = OrderedDict() root = Tk() count = 0 for key, value in dct.items(): label = Label(root, text = '{}: '.format(key)) entry = Entry(root) entry.insert(END, value) label.grid(row= count, column=0) entry.grid(row= count, column=1) self.entries[key] = entry count += 1 btn = Button(root,text="Print Fiedls") btn.grid(row= count+1, column=1) btn.bind('<Button-1>', self.ret) root.mainloop() def ret(self, event): for key, entry in self.entries.items(): print(key, entry.get() ) if __name__ == '__main__': args = OrderedDict([('c1',5), ('c2',10), ('c3',15)]) window = MyWindow(args) args = OrderedDict([('первый',5), ('второй',10), ('третий',15), ('четвертый',16), ('последний',12222)]) window = MyWindow(args)
[code python][/code]
Отредактировано PEHDOM (Ноя. 17, 2017 11:59:43)
Офлайн