Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 30, 2008 18:17:41

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

MultiListbox in Tkinter need help

собственно накопал в нэте - вот http://code.activestate.com/recipes/52266/

from Tkinter import *

class MultiListbox(Frame):
def __init__(self, master, lists):
Frame.__init__(self, master)
self.lists =
for l,w in lists:
frame = Frame(self); frame.pack(side=LEFT, expand=YES, fill=BOTH)
Label(frame, text=l, borderwidth=1, relief=RAISED).pack(fill=X)
lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0,
relief=FLAT, exportselection=FALSE)
lb.pack(expand=YES, fill=BOTH)
self.lists.append(lb)
lb.bind('<B1-Motion>', lambda e, s=self: s._select(e.y))
lb.bind('<Button-1>', lambda e, s=self: s._select(e.y))
lb.bind('<Leave>', lambda e: ‘break’)
lb.bind('<B2-Motion>', lambda e, s=self: s._b2motion(e.x, e.y))
lb.bind('<Button-2>', lambda e, s=self: s._button2(e.x, e.y))
frame = Frame(self); frame.pack(side=LEFT, fill=Y)
Label(frame, borderwidth=1, relief=RAISED).pack(fill=X)
sb = Scrollbar(frame, orient=VERTICAL, command=self._scroll)
sb.pack(expand=YES, fill=Y)
self.lists=sb.set

def _select(self, y):
row = self.lists.nearest(y)
self.selection_clear(0, END)
self.selection_set(row)
return ‘break’

def _button2(self, x, y):
for l in self.lists: l.scan_mark(x, y)
return ‘break’

def _b2motion(self, x, y):
for l in self.lists: l.scan_dragto(x, y)
return ‘break’

def _scroll(self, *args):
for l in self.lists:
apply(l.yview, args)

def curselection(self):
return self.lists.curselection()

def delete(self, first, last=None):
for l in self.lists:
l.delete(first, last)

def get(self, first, last=None):
result =
for l in self.lists:
result.append(l.get(first,last))
if last: return apply(map, + result)
return result

def index(self, index):
self.lists.index(index)

def insert(self, index, *elements):
for e in elements:
i = 0
for l in self.lists:
l.insert(index, e)
i = i + 1

def size(self):
return self.lists.size()

def see(self, index):
for l in self.lists:
l.see(index)

def selection_anchor(self, index):
for l in self.lists:
l.selection_anchor(index)

def selection_clear(self, first, last=None):
for l in self.lists:
l.selection_clear(first, last)

def selection_includes(self, index):
return self.lists.selection_includes(index)

def selection_set(self, first, last=None):
for l in self.lists:
l.selection_set(first, last)

if __name__ == ‘__main__’:
tk = Tk()
Label(tk, text='MultiListbox').pack()
mlb = MultiListbox(tk, (('Subject', 40), ('Sender', 20), ('Date', 10)))
for i in range(1000):
mlb.insert(END, ('Important Message: %d' % i, ‘John Doe’, ‘10/10/%04d’ % (1900+i)))
mlb.pack(expand=YES,fill=BOTH)
tk.mainloop()





я в этом примере ничего не понимаю(имею хроническое непонимание кода GUI), понял только, как добавить свой столбик и как записывать..

собственно вопрос заключается в том, как менять данные в этой штуке.. на лету

ну к примеру, у меня кроме этого класса снизу еще один класс который может управлять этой мультилистбоксой после ее запуска и пару функций которые работают постоянно и передают в мультибоксу значения:
class list_control:
def changeline(self,line_index, value_list):

def delete_line(self,line_index):

def line_add(self,line_index, value_list):

def aaa():
list_control.delete_line(2)

покажите как сделать changeline,а я все по аналогие пойму.. ато я вообще не могу понять, как после tk.mainloop() чего то делать.. может надо както потоками пользоваться,?



Отредактировано (Сен. 30, 2008 22:47:53)

Офлайн

#2 Окт. 1, 2008 09:02:46

.Serj.
От:
Зарегистрирован: 2008-09-27
Сообщения: 181
Репутация: +  0  -
Профиль   Отправить e-mail  

MultiListbox in Tkinter need help

Раз у тебя такое хроническое непонимание, может, стоило начать с примеров попроще?



Офлайн

#3 Окт. 1, 2008 17:28:47

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

MultiListbox in Tkinter need help

пасибо серж, очень помог блин..



Офлайн

#4 Окт. 1, 2008 18:23:27

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

MultiListbox in Tkinter need help

1. Оформите код в посте нормально, так - не читабельно.
2. Вы предлагаете что бы вам написали статью по написанию GUI на Tk. Тут или дать сразу готовое,что быстрее, но не правильно, или очень много всего объяснять.
Так что .Serj. абсолютно прав.

Отредактировано (Окт. 1, 2008 18:23:52)

Офлайн

#5 Окт. 1, 2008 19:50:38

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

MultiListbox in Tkinter need help

извините, и вправду чето не подумал насколько обьемно спрашиваю.. читал много(относительно)..но видно чегото я инзначально не так воспринимаю.. все мои недопонимания разрешит один пример..


from Tkinter import *
window = Tk()
tv=StringVar()
Entry(window,textvariable=tv,takefocus=True,).grid(row=1, column=0)
button=Button(window,text='Ok')
button.grid(row=3, column=0)
window.mainloop()

как так сделать, чтоб по кнопке ОК окно закрывалось и значение Entry записывалось в переменную, а программа продолжалась и могла работать с этой переменной.. заранее спасибо)



Офлайн

#6 Окт. 2, 2008 02:17:49

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

MultiListbox in Tkinter need help

Закрытие окна не делал специально. Пример просто выводит значение в текстововм поле в консоль

from Tkinter import *

def buttonPress(entry_string):
'''
Функция вызываемая при клике на кнопку
'''
print 'msg', entry_string # вывод в консоль.

window = Tk()
tv = StringVar()

entry1 = Entry(window,textvariable=tv,takefocus=True) # делаем отельный экзмпляр
entry1.grid(row=1, column=0)

# в нашем случае нужно использовать lambda
button = Button(window,text='Ok', command=lambda name="Guido": buttonPress(entry1.get())) # привязывам клик к функции и передаём значение в entry (получаем значение с помощью get).

button.grid(row=3, column=0)

window.mainloop()

Отредактировано (Окт. 2, 2008 02:19:40)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version