Уведомления

Группа в Telegram: @pythonsu

#1 Май 7, 2018 21:57:41

NiOl
Зарегистрирован: 2018-05-07
Сообщения: 19
Репутация: +  1  -
Профиль   Отправить e-mail  

Табличка на tkinter

Добрый день, знакомство с питоном только начал, опыта написания нет, потому нужен просто совет:
Нужна табличка, для “переносимости” хочу использовать только tkinter, отправные данные следующие:

- табличка будет внутри Фрейма
- к табличке будет приделана полоса прокрутки
- в “ячейках” могут быть как текст, так и активные элементы, типа выпадающих списков, чекбоксов и т.д., для редактирования, но строго “типизированно” по столбцу, т.е., например, Чекбокс может быть только во 2м столбце и т.п.
- наполнение таблицы динамическое, происходит по ходу выполнения скрипта
- скорее всего буду делать сортировку по столбцам

Первая мысль - таблицу собрать из нескольких блоков Text (по 1 для для каждого столбца), но не совсем понятно, как ограничить ширину полученного прямоугольника, что бы не расползлась сама таблица, и не допустить, что бы содержимое переносилось на след. строку, что бы не уехали строки всей таблицы. Так же, непонятен механизм привязки всех блоков Text к общей полоске прокрутки.

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

Офлайн

#2 Май 7, 2018 23:32:45

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Табличка на tkinter

Переносимость говорите :)
https://github.com/dddomodossola/remi



Офлайн

#3 Май 8, 2018 01:29:21

NiOl
Зарегистрирован: 2018-05-07
Сообщения: 19
Репутация: +  1  -
Профиль   Отправить e-mail  

Табличка на tkinter

Выглядит весьма и весьма интересно, в будущем точно пригодится, но пока плохо понимаю, как с внешними библиотеками таскать на флешке скрипт с компа на комп и запускать ничего не устанавливая…

А можете подсказать, как обычно делают таблички на Питоне?
Меня очень сильно сбил с толку тот факт, что программирование на Питоне (а похоже, что не только на нем) ориентировано на краткую обработку цепочки событий, как таковой основной процедуры программы нет, что крайне непривычно, т.к. кодил только под ДОСом и давно, и никак не могу продумать такую простую вещь, как табличка.

Офлайн

#4 Май 8, 2018 07:26:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Табличка на tkinter

NiOl
т.е. код как бы и не важен, важен принцип реализации
А для чего тебе графика в этой программе? Показать окружающим, кто нифига не понимает, какой ты ценный специалист?
Берёшься за графику, не понимая в этом ничего.

NiOl
А можете подсказать, как обычно делают таблички на Питоне?
Обычно берут PyQt и там табличка в виде представления, подключаемого к модели, выполняющий все внутренние вычисления.
Ещё есть web-интерфейс, там HTML применяется. Приложение запускается локально на сокете и общаешься с ним через обычный браузер, как с сайтом.

NiOl
Меня очень сильно сбил с толку тот факт, что программирование на Питоне (а похоже, что не только на нем) ориентировано на краткую обработку цепочки событий
Это, похоже, имеется в виду GUI. Ну да, это надо сначала изучить. Чтобы изучить, надо взять что-то полноценное типа PyQt, а потом уже пробовать реализовать программу на таком обрубке как tkinter.

В общем, не факт, что ты и консольный вариант реализуешь. Обычно принято делать командную оболочку, куда вводишь команду и оболочка отвечает тебе списком. Эта форма выигрывает у менюшки (“если хотите то-то, наберите цифру один”) тем, что не надо строить дерево меню и очень много пунктов туда можно засунуть, тогда как в менюшку много не засунешь.

Переносимость - это последнее, о чём стоит думать новичку, потому что часто у него есть уверенность, что он напишет непереносимую и что проблема в том, как написать переносимую. Эта уверенность ничем не подкреплена. Ты можешь взяться за программу, не концентрируясь на её интерфейсе (сделав его элементарным), и окажется, что ты не можешь основные вычисления написать. Как бы то ни было, вот эти основные вычисления в программе не должны зависеть от того, какой у неё интерфейс: консольный, графический или веб. Интерфейс должен отдельно существовать от вычислений. Тогда его можно менять и вообще иметь несколько интерфейсов одновременно.



Отредактировано py.user.next (Май 8, 2018 07:37:59)

Офлайн

#5 Май 8, 2018 07:57:46

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Табличка на tkinter

NiOl
флешке скрипт с компа на комп и запускать ничего не устанавливая…
Короткий ответ. В корень флешки копируете свой питон. Скрипты кладете рядом. Делаете bat файл такого вида:
../../python36/python my.py
естественно правильно указываете относительный путь…
После втыка флешки пускаете батник.

Длинный ответ. Операционки бывают разные. Dos, winxp (x86), win10(x86-64), unix, mac os… Таскание exe В таком случае вообще бесполезно. Для каждой ОС нужен свой (даже для разных версий windows). Но питон есть предустановленный во всех операционках кроме винды. Есть инструменты типа venv Которые скопируют нестандартные библиотеки в вашу папку. Если питон установлен то пускаете скрипт с флешки и все.

Смешной ответ. А что вы собрались таскать? На дворе 21 век. Если вы remi используете то ваше приложение и так будет всем в сети видно. url просто введите. (ну или в батник запишите start yuourl)

Частый ответ: А чего вы с флешкой паритесь? таскайте ноутбук(или телефон) на котором все установлено, он не шибко больше.

Правильный ответ: У вас неправильная постановка вопроса. Любое приложение требует для работы установки. Повторюсь ЛЮБОЕ!!! Вы же не требуете чтобы ворд без установки работал с флешки? И чем сложнее приложение тем это важнее. Да совсем примитив можно так запустить, но только примитив.

Совет такой. Если обслуживаете до 100 рабочих мест. Просто один раз ставите Питон всем у кого его нет и спокойно ходите с *.py файлом если он простой или устанавливаете ваше произведение при помощи pip если оно сложное. Поверьте это гораздо проще изготовления замудреных флешек. Если масштабы покруче то надо думать о web


NiOl
А можете подсказать, как обычно делают таблички на Питоне?
Просто таблички никак. Питон это язык в котором нет примитива табличка. (в библиотеках типа pandas есть таблички).

Вы хотите сказать Вам нужен GUI?
За все время работы с питоном не было случая чтобы потребовалось писать GUI для работы с простыми таблицами. Ответ на вопрос как обычно делают понятен - никак.

Если редактировать сложно структуированные данные то я их редактирую просто в текстовом редакторе. Выбираете подходящий формат например yaml,csv и т.п. И я этот способ не променяю ни на какой мудреный формат с галочками потому что текстовый редактор дает гораздо больше возможностей (в том числе и показывать галочки вместо true/false).

Если очень приспичило то есть wxPython, pyQt.



Офлайн

#6 Май 8, 2018 19:28:11

NiOl
Зарегистрирован: 2018-05-07
Сообщения: 19
Репутация: +  1  -
Профиль   Отправить e-mail  

Табличка на tkinter

Советов много, не все по теме, но все равно спасибо, многие моменты позже пригодятся. GUI действительно нужен (“графика” все же нечто большее), т.к. это должно выглядить , как полноценное приложение, без изысков, но удобное для манипуляций без матюгов со стороны пользователя )))
Пока тему не закрываю, если смогу реализовать “изящно”, хотя врят ли по канонам, выложу тут.

Офлайн

#7 Май 8, 2018 22:40:15

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Табличка на tkinter

NiOl в ткинтере нет их коробки табличного виджета, поэтому кадый пилит свой велосипед если нужно, например:
http://code.activestate.com/recipes/580793-tkinter-table-with-scrollbars/
как минимум можете посмотреть как там все устроено, а может чтото возьмете на вооружение.
Хотя ИМХО используйте pyQT\pyside и не партесь, ткинтер это от безысходности.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#8 Май 9, 2018 07:10:09

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Табличка на tkinter

NiOl
- табличка будет внутри Фрейма
- к табличке будет приделана полоса прокрутки
- в “ячейках” могут быть как текст, так и активные элементы, типа выпадающих списков, чекбоксов и т.д., для редактирования, но строго “типизированно” по столбцу, т.е., например, Чекбокс может быть только во 2м столбце и т.п.
- наполнение таблицы динамическое, происходит по ходу выполнения скрипта
- скорее всего буду делать сортировку по столбцам

В tkinter.ttk есть виджет Treeview
 from tkinter.ttk import Treeview
вполне нормальная таблица, не знаю, можно ли как-то вставлять активные элементы, но всё остальное возможно.

Офлайн

#9 Июнь 1, 2018 01:09:36

NiOl
Зарегистрирован: 2018-05-07
Сообщения: 19
Репутация: +  1  -
Профиль   Отправить e-mail  

Табличка на tkinter

Начал “пилить” свой велосипед, пробовать разные варианты…

Сначала нарисовал “нечто” на базе 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()

Офлайн

#10 Июнь 1, 2018 18:50:46

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Табличка на tkinter

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 !!
В этих строках кода вы меняете чёрный цвет шрифта (по умолчанию) на точно такой же чёрный цвет, а белый цвет фона (по умолчанию) на точно такой же белый цвет. Вы не видите разницу между тем что было и что стало? Я тоже не вижу. Так, замените белый и чёрный на красный и синий, сразу увидите разницу.

P.S. Про лютый говнокод я молчу, не было такого вопроса.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version