Найти - Пользователи
Полная версия: Tkinter, два listbox'a
Начало » Python для новичков » Tkinter, два listbox'a
1 2
stas90
Всем привет!

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

определил для обоих боксов 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()

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

под виндой работает с ошибкой как говорил, сейчас попробовал на маке - работает отлично…
PEHDOM
stas90
А у вас какая ОС?
Win7 x64, Python 3.2.5 32 bit.
stas90
Завтра на работе буду, там тоже 7ка, оттуда сделаю со скринами
stas90
На работе опять выдает ошибку, прикрепляю скрины,
первый после выбора категории


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


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

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

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


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

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

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

Прикрепляю немного дополненный код программы:
 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()

Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB