Найти - Пользователи
Полная версия: Класс для создания окна tkinter
Начало » Python для экспертов » Класс для создания окна tkinter
1
winmasta
Всем добрый день, продолжаю изучать 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)

для каждого поля ввода своя переменная, но не хочется копипастить, а хочется например передать в функцию (или класс я еще не совсем с ними разобрался) произвольное количество переменных через *args и там уже в цикле сконструировать окно и отдать пользователю.

Подскажите основную идею как это вообще должно происходить.

PS и попутно вопрос, как в tkinter передавать не StringVar, а IntVar

PPS попутал тему, хотел для новичков закинуть, модераторы поправьте пожалуйста
PEHDOM
както так: http://python.su/forum/topic/32446/?page=1#post-177585
там пример для pyqt но сам принцип одинаков, создавать Entry и Label в цикле и помещать их в списки или словари вместо связывания с конкретной переменной.
winmasta
PS и попутно вопрос, как в tkinter передавать не StringVar, а IntVar
если вы про текст который получаете из Entry то его нужно превратьть в int
 value = c1_entry.get()
int_val = IntVar()
int_val.set(value)
winmasta
PEHDOM
както так: http://python.su/forum/topic/32446/?page=1#post-177585там пример для pyqt но сам принцип одинаков, создавать Entry и Label в цикле и помещать их в списки или словари вместо связывания с конкретной переменной.
Если к примеру мы имеем

c1 = StringVar()

то потом в функции

_c1 = int(c1.get())

это понятно, можно проще

c1 = IntVar()

и потом

_c1 = c1.get()

Ну а как например float передать не через текст, какие вообще там типы есть ? Я никак не смог найти описание.

А по первому вопросу, там основная сложность, что имя переменной (например c1) является частью имени другой переменной, например c1_label, . Допустим можно соорудить функцию:

 def window(*args):
    for arg in args:
        ...
window(c1, c2, c3)

а вот как в этой функции сказать, что аргумент есть переменная, а потом часть названия переменной я не понимаю.
PEHDOM
winmasta
Ну а как например float передать не через текст, какие вообще там типы есть ? Я никак не смог найти описание.
чтото ничего не поинимаю, что значит передать “не через текст”? может приведете простенький пример чтобы было понятнее?
типы в пайтоне https://docs.python.org/3/library/stdtypes.html
типы переменных в ткинтер http://effbot.org/tkinterbook/variable.htm
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB