Форум сайта python.su
1
Добрый день, знакомство с питоном только начал, опыта написания нет, потому нужен просто совет:
Нужна табличка, для “переносимости” хочу использовать только tkinter, отправные данные следующие:
- табличка будет внутри Фрейма
- к табличке будет приделана полоса прокрутки
- в “ячейках” могут быть как текст, так и активные элементы, типа выпадающих списков, чекбоксов и т.д., для редактирования, но строго “типизированно” по столбцу, т.е., например, Чекбокс может быть только во 2м столбце и т.п.
- наполнение таблицы динамическое, происходит по ходу выполнения скрипта
- скорее всего буду делать сортировку по столбцам
Первая мысль - таблицу собрать из нескольких блоков Text (по 1 для для каждого столбца), но не совсем понятно, как ограничить ширину полученного прямоугольника, что бы не расползлась сама таблица, и не допустить, что бы содержимое переносилось на след. строку, что бы не уехали строки всей таблицы. Так же, непонятен механизм привязки всех блоков Text к общей полоске прокрутки.
Нужны советы по логике организации таблички, что бы не изобретать велосипед, а потом, потратив драгоценное время (и получив полезные опыт) начать все сначала, пойти другим путем, и снова потратить время зря
))
* т.е. код как бы и не важен, важен принцип реализации
Офлайн
253
Переносимость говорите :)
https://github.com/dddomodossola/remi
Офлайн
1
Выглядит весьма и весьма интересно, в будущем точно пригодится, но пока плохо понимаю, как с внешними библиотеками таскать на флешке скрипт с компа на комп и запускать ничего не устанавливая…
А можете подсказать, как обычно делают таблички на Питоне?
Меня очень сильно сбил с толку тот факт, что программирование на Питоне (а похоже, что не только на нем) ориентировано на краткую обработку цепочки событий, как таковой основной процедуры программы нет, что крайне непривычно, т.к. кодил только под ДОСом и давно, и никак не могу продумать такую простую вещь, как табличка.
Офлайн
857
NiOlА для чего тебе графика в этой программе? Показать окружающим, кто нифига не понимает, какой ты ценный специалист?
т.е. код как бы и не важен, важен принцип реализации

NiOlОбычно берут PyQt и там табличка в виде представления, подключаемого к модели, выполняющий все внутренние вычисления.
А можете подсказать, как обычно делают таблички на Питоне?
NiOlЭто, похоже, имеется в виду GUI. Ну да, это надо сначала изучить. Чтобы изучить, надо взять что-то полноценное типа PyQt, а потом уже пробовать реализовать программу на таком обрубке как tkinter.
Меня очень сильно сбил с толку тот факт, что программирование на Питоне (а похоже, что не только на нем) ориентировано на краткую обработку цепочки событий
Отредактировано py.user.next (Май 8, 2018 07:37:59)
Офлайн
253
NiOlКороткий ответ. В корень флешки копируете свой питон. Скрипты кладете рядом. Делаете bat файл такого вида:
флешке скрипт с компа на комп и запускать ничего не устанавливая…
NiOlПросто таблички никак. Питон это язык в котором нет примитива табличка. (в библиотеках типа pandas есть таблички).
А можете подсказать, как обычно делают таблички на Питоне?
Офлайн
1
Советов много, не все по теме, но все равно спасибо, многие моменты позже пригодятся. GUI действительно нужен (“графика” все же нечто большее), т.к. это должно выглядить , как полноценное приложение, без изысков, но удобное для манипуляций без матюгов со стороны пользователя )))
Пока тему не закрываю, если смогу реализовать “изящно”, хотя врят ли по канонам, выложу тут.
Офлайн
294
NiOl в ткинтере нет их коробки табличного виджета, поэтому кадый пилит свой велосипед если нужно, например:
http://code.activestate.com/recipes/580793-tkinter-table-with-scrollbars/
как минимум можете посмотреть как там все устроено, а может чтото возьмете на вооружение.
Хотя ИМХО используйте pyQT\pyside и не партесь, ткинтер это от безысходности.
[code python][/code]
Офлайн
72
NiOl
- табличка будет внутри Фрейма
- к табличке будет приделана полоса прокрутки
- в “ячейках” могут быть как текст, так и активные элементы, типа выпадающих списков, чекбоксов и т.д., для редактирования, но строго “типизированно” по столбцу, т.е., например, Чекбокс может быть только во 2м столбце и т.п.
- наполнение таблицы динамическое, происходит по ходу выполнения скрипта
- скорее всего буду делать сортировку по столбцам
from tkinter.ttk import Treeview
Офлайн
1
Начал “пилить” свой велосипед, пробовать разные варианты…
Сначала нарисовал “нечто” на базе Text. Что-то не понравилось, уже не помню что.
Попытался переделать на Listbox, стал прикручивать Scrollbar, запутался и вытер.
Возложил надежды на Canvas, но он оказался совсем неудобным для моих целей.
Выяснил, что скролятся только эти 3 виджета, расстроился и решил вернуться к идее с Listbox.
И в самом же начале наткнулся на непонятный баг - не получается применить свойства цвета, а первый вариант, на Text, где цвет применялся корректно, случайно затер при синхронизации флешек.
Прошу помочь найти ошибку, почему свойства игнорируются. Вернее не игнорируются, я их считываю обратно и сверяю, но они не применяются.
* Проблемные места пометил двумя восклицательными знаками.
import tkinter as tk W=tk.Tk() def DrawTable(PW,ER,R,C,Fa,Ba,Fp,Bp,Fm,Bm,*H): # Build simple empty Table """ PW: Parent Wifget, ER: Name of Event_Routine(E,R,C)?, R,C: Rows to draw (0=auto), Columns (0=1) Fa,Ba,Fp,Bp,Fm,Bm: Foregraund Color & Backgraund Color for Active/Passive/Marked column (marked: sorting by) Head: Columns * ( Width(0=1) + 100*is_passive, Head text ) Return: Tuple of Widget`s data: T[0]=Table Frame T[1]=(R,C,Fa,Ba,Fp,Bp,Fm,Bm) T[2]=Scroller T[3..C+2]=Table Headers (Label) TW[3+C..5+C+C]=Table Columns (Listbox) """ def setDef(v,d): if v=='': v=d return v N,T,Fa,Ba,Fp,Bp,Fm,Bm=0,[],setDef(Fa,'#000'),setDef(Ba,'#FFF'),setDef(Fp,'#000'),setDef(Bp,'#F8F8F8'),setDef(Fm,'#000'),setDef(Bm,'#FFFFF8') C+=1 T.append(tk.Frame(PW)) # Common container for Table elements T[0].pack() T.append((R,C,Fa,Ba,Fp,Bp,Fm,Bm)) T.append(tk.Scrollbar(T[0])) T[2].grid(row=1,column=C,sticky=tk.N+tk.S) for h in range(0,C): # Prepare Labels T.append(tk.Label(T[0])) T[h+3].grid(row=0,column=h) for h in H: if type(h)==type(C): # Numeric? if h<100: # passive F,B=Fa,Ba else: F,B=Fp,Bp T[N+3].config(fg=F,bg=B) # !! BUG HERE !! T.append(tk.Listbox(T[0],width=(h%100)+1,selectmode=tk.BROWSE,fg=F,bg=B)) # !! AND HERE !! T[N+C+3].grid(row=1,column=N) N+=1 else: T[N+2].config(text=h) # !! HERE OK !! return T def TabHandler(event,r,c): # For events pass Table=DrawTable(W,TabHandler,0,8,'','','#114','','','',0,'Check1',100,'Check2',102,'NN',14,'Name',0,'Flag1',0,'Flag2',0,'Flag3',104,'Size',119,'File Name') W.mainloop()
Офлайн
72
NiOlЯ вижу две строки кода с пометками:
Прошу помочь найти ошибку, почему свойства игнорируются. Вернее не игнорируются, я их считываю обратно и сверяю, но они не применяются.
* Проблемные места пометил двумя восклицательными знаками.
T[N+3].config(fg=F,bg=B) # !! BUG HERE !! T.append(tk.Listbox(T[0],width=(h%100)+1,selectmode=tk.BROWSE,fg=F,bg=B)) # !! AND HERE !!
Офлайн