Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2018 22:30:09

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

Табличка на tkinter

rami
В этих строках кода вы меняете чёрный цвет шрифта (по умолчанию) на точно такой же чёрный цвет, а белый цвет фона (по умолчанию) на точно такой же белый цвет. Вы не видите разницу между тем что было и что стало? Я тоже не вижу. Так, замените белый и чёрный на красный и синий, сразу увидите разницу.
Вы меня застали в расплох. Видимо была ошибка в утерянном варианте на виджетах Text, т.к. цвета перекачавали оттуда, и там разница на старом TN монторе была очень заметна, а по факту, выходит, что я на TN вообще не замечал светло-серый фон… значит сейчас все исполняется корректно (попробовал жесче цветовую градацию).
Но если здесь я был просто удивлен, то
rami
… Про лютый говнокод я молчу…
меня просто убили )))
Можно по-подробнее, т.к. будучи новичком, не понял, что не так?

Офлайн

#2 Июнь 1, 2018 23:33:38

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

Табличка на tkinter

В функцию нужно передавать только обязательные параметры (заранее не известные), параметры известные заранее лучше передавать по умолчанию, а ещё лучше как константы (переменные с заранее присвоенным значением). Сравните функции:

 def DrawTable(Fa,Ba,Fp,Bp,Fm,Bm): #все параметры должны быть переданы
    """
    Строка документции
    """
    def setDef(v,d):    #что делает эта функция???
        if v=='':
            v=d
        return v
    #в следующей строке кода переназначаются параметры переданные в функцию DrawTable. Вот это и есть лютый говнокод.
    Fa,Ba,Fp,Bp,Fm,Bm=setDef(Fa,'#000'),setDef(Ba,'#FFF'),setDef(Fp,'#000'),setDef(Bp,'#F8F8F8'),setDef(Fm,'#000'),setDef(Bm,'#FFFFF8')
    print(Fa,Ba,Fp,Bp,Fm,Bm)    #смотрим на переменные
    """
    Какой-то код не нужный пока
    """
Table=DrawTable('','','#114','','','')  #передаём в функцию пять пустых и один нормальный параметр
#сравните с этий функцией:
def DrawTable1(Fa='#000',Ba='#FFF',Fp='#000',Bp='#F8F8F8',Fm='#000',Bm='#FFFFF8'): #если параметр не передан, то будет по умолчанию
    """
    Строка документции
    """
    print(Fa,Ba,Fp,Bp,Fm,Bm)    #смотрим на переменные
    """
    Какой-то код не нужный пока
    """
Table=DrawTable1(Ba='этот параметр будет изменён',Fm='этот тоже')  #передаём в функцию только то, что должно измениться

Сравните ваш код с этим (хотя, и этот не идеал):
 import tkinter as tk
#очень удобно назначать константы здесь:
Fa,Ba='#000','#fdd'     #Foregraund Color & Backgraund Color for Active
Fp,Bp='#000','#dfd'     #Foregraund Color & Backgraund Color for Passive
Fm,Bm='#000','#ddf'     #Foregraund Color & Backgraund Color for Marked
W=tk.Tk()
def DrawTable(ER,H):    #Build simple empty Table
    for i,k in enumerate(H):    #создаём виджеты в соответствии с переданными параметрами
        if H[k]<100:    #Passive
            tk.Label(W,text=k,relief='groove',fg=Fp,bg=Bp).grid(row=0,column=i,sticky='we')
            tk.Listbox(W,width=(H[k]%100)+1,selectmode='browse',fg=Fp,bg=Bp).grid(row=1,column=i,sticky='we')
        else:           #Active
            tk.Label(W,text=k,relief='groove',fg=Fa,bg=Ba).grid(row=0,column=i,sticky='we')
            tk.Listbox(W,width=(H[k]%100)+1,selectmode='browse',fg=Fa,bg=Ba).grid(row=1,column=i,sticky='we')
def TabHandler(event,r,c):      #For events
    pass
Table=DrawTable(TabHandler,{'Check1':0,'Check2':100,'NN':102,'Name':14,'Flag1':0,'Flag2':0,'Flag3':0,'Size':104,'File Name':119})
W.mainloop()

Офлайн

#3 Июнь 4, 2018 19:40:10

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

Табличка на tkinter

Очень интересно, спасибо!
Но некоторые моменты не совсем понятны. Самый главный - Вы опустили наполнение таблицы объектов для того что бы удилить внимание ключевым моментам? Или в некоторых случаях “return” не нужен?
И еще, скорее замечание, вариант с созданием виджетов с мгновенным размещением у меня частенько переставал работать с ошибкой, что объект еще не создан. Поэтому для себя я перестал экономить код на создании виджетов.

Офлайн

#4 Июнь 4, 2018 21:40:57

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

Табличка на tkinter

NiOl
Но некоторые моменты не совсем понятны. Самый главный - Вы опустили наполнение таблицы объектов для того что бы удилить внимание ключевым моментам? Или в некоторых случаях “return” не нужен?
“return” нужен для возвращения значения функции, без “return” функция возвратит “None” (по умолчанию). Вы хотите чтобы функция DrawTable приняла вагон параметров и вернула пять вагонов хлама? Что вы хотите делать с тем, что возвращает функция? Как правило, такие функции ничего не возвращают, а “только рисуют картинку” для имеющихся данных.

Я всего лишь показал, что тот результат что даёт ваш код можно получить с помощью нормального кода, более короткого, простого и понятного. Пишите что получается, а что нет, с кодом.

Офлайн

#5 Июнь 5, 2018 00:16:40

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

Табличка на tkinter

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

Вобщем, я зря надеялся, что “сейчас быстренько за пару недель” сделаю людям хорошо, вероятно, что вопросов впереди будет в разы больше, чем на текущий момент. Многое еще не укладывается в голове, как новая фигру в тетрисе ))) например еще обкуриваю “for i,k in enumerate(H)” - как это делать цикл сразу на 2 переменные одновременно? Если описание “enumerate” еще более-менее в инете отыскалось (встроенный help весьма беден и малопонятен

Офлайн

#6 Июнь 5, 2018 09:37:30

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

Табличка на tkinter

NiOl
…например еще обкуриваю “for i,k in enumerate(H)” - как это делать цикл сразу на 2 переменные одновременно?
Ну, это просто, у вас есть список (словарь, кортеж, строка и т. д.), например:
 H=['a','b','c']
for element in H:    #перечисляет сами элементы
    print(element)
for number,element in enumerate(H):   #перечисляет пары: номер и элемент
    print(number,element)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version