Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2017 10:52:07

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Всем привет!

Делаю простенькую программку:
есть два листбокса, при выборе в первом - появляются соответствующие элементы во втором,
при выборе элемента во втором - должно произойти действие.

определил для обоих боксов bind'ы, когда выбираю в первом листбоксе элемент - во втором все отображается как надо, а когда нажимаю на втором - выполняется функция которая указана в bind'e первого бокса, потом для второго.

как сделать, чтобы для каждого бокса была своя функция и вызывалась только она?

прикрепляю полный код

 other = {}
anchor = {"Позиция 1": "111", "Позиция 2": "222"}
plate = {"Позиция 1":"0,39"}
category = {"Категория 1": anchor, "Категория 2": plate, "Прочее":other}
from tkinter import *
root = Tk()
root.geometry("500x500")
categoryList = Listbox(root, width = 15)
categoryList.grid(row=0, column=0)
for i in category:
    categoryList.insert(END, i)
def doNothing(evt):
    print ("Do nothing")
def onSelectCategory(evt):
    print (evt.widget)
    itemsCounter = productList.size()
    
    if itemsCounter > 0:
        productList.delete(0, END)
    
    itemSelected = categoryList.get(categoryList.curselection())
    tableFill = {}
    if itemSelected == "Категория 1":
        tableFill = anchor
    elif itemSelected == "Категория 2":
        tableFill = plate
    elif itemSelected == "Прочее":
        tableFill = other
    for i in tableFill:
        productList.insert(END, i)
categoryList.bind('<<ListboxSelect>>', onSelectCategory)
productList = Listbox(root, width = 30)
productList.grid(row=0, column=1)
productList.bind('<<ListboxSelect>>', doNothing)
root.mainloop()

Спасибо

Офлайн

#2 Июнь 1, 2017 12:56:37

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

Tkinter, два listbox'a

Или я чегото не понял, или код не полон, потому как выбирая элемент в втором листбоксе выполняется только функция второго листбокса doNothing.



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

Отредактировано PEHDOM (Июнь 1, 2017 12:56:54)

Офлайн

#3 Июнь 1, 2017 14:01:19

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

А у вас какая ОС?

под виндой работает с ошибкой как говорил, сейчас попробовал на маке - работает отлично…

Офлайн

#4 Июнь 1, 2017 14:26:35

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

Tkinter, два listbox'a

stas90
А у вас какая ОС?
Win7 x64, Python 3.2.5 32 bit.



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

Офлайн

#5 Июнь 1, 2017 15:49:36

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Завтра на работе буду, там тоже 7ка, оттуда сделаю со скринами

Офлайн

#6 Июнь 2, 2017 04:12:54

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

На работе опять выдает ошибку, прикрепляю скрины,
первый после выбора категории


второй после выбора позиции


Получается при выборе категории вызывается функция onSelectCategory, а при выборе позиции вызываются обе: и onSelectCategory и doNothing

Версия питона 3.6.1
Винда 7

Самое интересное что на маке все работает отлично


///////////Update:
Еще: если нажимать не на название категории а просто на listbox то проблем нет, отрабатывает нужная функция. так же и со вторым листбоксом

Может быть это баг данной версии питона? или tkinter?

Отредактировано stas90 (Июнь 2, 2017 06:08:53)

Офлайн

#7 Июнь 2, 2017 09:36:28

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

Tkinter, два listbox'a

stas90
Может быть это баг данной версии питона? или tkinter?
Тяжело сказать потому как нет возможности повторить багу. Поставил я себе 3.6.1 всеравно баг не повторяется. Походу это у вас какаято локальная проблема + оно еще исключение какогото бросает.. Попробуйте сначала переустановить пайтон.



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

Офлайн

#8 Июнь 2, 2017 10:20:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Для начала я бы избавился от кириллицы в путях, на винде это известная проблема



Офлайн

#9 Июнь 2, 2017 10:45:46

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Спасибо за ответ!

Сначала переустановка питона не помогла, потом поставил предыдущую версию - заработало

Офлайн

#10 Июнь 2, 2017 18:46:33

stas90
Зарегистрирован: 2017-05-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, два listbox'a

Еще попутный вопрос, можно ли как-то переработать мой код по правилам ООП, с классами, объектами?

Прикрепляю немного дополненный код программы:

 import collections
from tkinter import *
import tkinter.ttk
other = collections.OrderedDict(
    [
    ("aa", "0.2"),
    ("bb", "0.435"),
    ("cc", "0.275"),
    ("dd", "7"),
    ("ee", "1")
    ])
anchor = collections.OrderedDict(
    [
    ('a', '1.6'),
    ('b', '2.45'),
    ('c', '3'),
    ('d', '3.9'),
    ('e', '1'),
    ('f', '1'),
    ('g', '1')
    ('h','1.1'),
    ('i', '1')
    ])
plate = collections.OrderedDict(
    [
    ("aa", "0.314"),
    ("bb", "0.39"),
    ("cc", "1.427")
    ])
category = collections.OrderedDict()
category["Анкера"]=anchor
category["Шайба"]=plate
category["Прочее"]=other
summ = {}
root = Tk()
root.title("Расчет веса")
tree = tkinter.ttk.Treeview(root)
tree["columns"]=("c","a","b")
tree.column("c", width=100 )
tree.column("a", width=100 )
tree.column("b", width=100)
tree.heading("c", text="Длина")
tree.heading("a", text="Количество")
tree.heading("b", text="Вес, кг")
tree.grid(row=3, columnspan=2)
lbl = Label(root, text = 'Количество')
enterFieldQ = Entry(root,width=10)
enterFieldQ.grid(row=2,column=1)
lbl.grid(row=1, column=0)
lbl1 = Label(root, text = 'Длина')
enterField = Entry(root,width=10)
enterField.grid(row=1,column=1)
lbl1.grid(row=2, column=0)
lblRes = Label(root, text="Итого:")
lblRes.grid(row=4, column=0)
lblRes1 = Label(root, text="")
lblRes1.grid(row=4, column=1)
categoryList = Listbox(root, width = 15)
categoryList.grid(row=0, column=0)
for i in category:
    categoryList.insert(END, i)
categorySelected = ""
totalW = 0
x=0
def addToTree(evt):
    global x
    global categorySelected
    global totalW
    global item
    print ("Pressed enter")
    quantity = enterField.get()
    length = enterFieldQ.get()
    if length == "":
        length = 1
    if quantity != "":
        weight = int(quantity)*float(category[categorySelected][item])
        weight = weight * float(length)
        weight = round(weight,2)
        tree.insert("" , x, text=item, values=(length,quantity,weight))
        totalW = totalW + weight
        totalW = round(totalW,2)
        lblRes1.configure(text=totalW)
        enterFieldQ.delete(0,END)
        enterField.delete(0,END)
        x=x+1
def onSelectCategory(evt):
    print("Category selected")
    global categorySelected
    itemsCounter = productList.size()
    if itemsCounter > 0:
        productList.delete(0, END)
    categorySelected = categoryList.get(categoryList.curselection())
    tableFill = {}
    if categorySelected == "Анкера":
        tableFill = anchor
    elif categorySelected == "Шайба":
        tableFill = plate
    elif categorySelected == "Прочее":
        tableFill = other
    for i in tableFill:
        productList.insert(END, i)
item=""
def onSelectItem(evt):
    print ("Item selected")
    global item
    item = productList.get(productList.curselection())
def doubleClick(evt):
    global totalW
    print("doubleClick")
    if totalW > 0:
        selected_item = tree.selection()[0]
        print (selected_item)
        curItem = tree.focus()
        minusWeight = float(tree.item(curItem)["values"][2])
        totalW = totalW - minusWeight
        totalW = round(totalW,2)
        lblRes1.configure(text=totalW)
        tree.delete(selected_item)
productList = Listbox(root, width = 30)
productList.grid(row=0, column=1)
productList.bind('<<ListboxSelect>>', onSelectItem)
categoryList.bind('<<ListboxSelect>>', onSelectCategory)
enterField.bind("<Return>", addToTree)
enterFieldQ.bind("<Return>", addToTree)
tree.bind("<Double-1>", doubleClick)
root.mainloop()

Спасибо!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version