Форум сайта python.su
0
Помогите пожалуйста, нужно вернуть переменную I из функции, пробовал через глобальную переменную, значение функции и как параметр вернуть, но похоже у меня где то ошибка с форматом значения….
from tkinter import* root=Tk() sizex = 600 sizey = 400 posx = 40 posy = 20 root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) itemsforlistbox=['one','two','three','four','five','six','seven'] def CurSelet(i): widget = i.widget selection=widget.curselection() i=(selection[0]) print(i) mylistbox=Listbox(root,width=60,height=10,font=('times',13)) mylistbox.bind('<<ListboxSelect>>',CurSelet) mylistbox.place(x=32,y=90) for items in itemsforlistbox: mylistbox.insert(END,items) root.mainloop()
Отредактировано wartes (Окт. 18, 2018 15:44:57)
Офлайн
72
Ваш вопрос не понятен, вы хотите получить не номер выбранного элемента в списке, а сам выбранный элемент ('one','two','three' и т.д.) ? Если да, то перепишите функцию CurSelet:
def CurSelet(i): widget = i.widget selection=widget.selection_get() print(selection)
Офлайн
0
так значение же осталось в пределах функции, может быть я не корректно выразился, мне значение этой функции нужно будет перенести в другую, вот в приведенном примере я получаю номер, записываю его в переменную и хочу использовать этот номер в другой функции, проблема в том что переменная i существует только в пределах это функции, больше нигде я использовать ее не могу.
Прошу прощения что криво выражаюсь, у меня голова уже кругом ходит
Отредактировано wartes (Окт. 18, 2018 16:54:22)
Офлайн
72
wartesПеременная mylistbox содержит в себе всё что связано со списком, в том числе что выделено в данный момент. Создавать специальную функцию для этого не нужно, из любой другой функции можно получить номер выделенной записи. В примере выбирайте запись в списке и жмите на кнопку:
… вот в приведенном примере я получаю номер, записываю его в переменную и хочу использовать этот номер в другой функции …
from tkinter import * root=Tk() sizex = 600 sizey = 400 posx = 40 posy = 20 root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) itemsforlistbox=['one','two','three','four','five','six','seven'] def CurSelet(): selection = mylistbox.curselection()[0] print(f'выбрано: {selection}') mylistbox=Listbox(root,width=60,height=10,font=('times',13)) mylistbox.place(x=32,y=90) mylistbox.insert(0, *itemsforlistbox) bt = Button(root, text='кнопка', command=CurSelet) bt.place(x=32,y=20) root.mainloop()
Офлайн
0
ramiА возможно как либо записать в переменную лишь выделенное?
Переменная mylistbox содержит в себе всё что связано со списком, в том числе что выделено в данный момент. Создавать специальную функцию для этого не нужно, из любой другой функции можно получить номер выделенной записи. В примере выбирайте запись в списке и жмите на кнопку:
Офлайн
72
wartesЯ вывожу на экран потому, что не знаю что ещё делать, вместо вывода на экран можно делать что угодно. Давайте пример (и описание словами), что нужно делать.
В вашем примере тоже только вывод на экран
Офлайн
72
wartesВот пример выбора действия:
В дальнейшем хочу что то типа“если в этом списке выбрано это, то делаем тото, а если выбрано другое, делаем другое”
from tkinter import Tk, StringVar, Listbox, Label itemsforlistbox=['Сделать первую клетку красной','Сделать вторую клетку красной', 'Сделать третью клетку красной','Сделать первую клетку синей', 'Сделать вторую клетку зелёной','Сделать третью клетку жёлтой', 'Закрыть окно'] def CurSelet(event): sel = mylistbox.curselection()[0] if sel == 0: lb1.config(bg='#f77') elif sel == 1: lb2.config(bg='#f77') elif sel == 2: lb3.config(bg='#f77') elif sel == 3: lb1.config(bg='#77f') elif sel == 4: lb2.config(bg='#7f7') elif sel == 5: lb3.config(bg='#ff7') elif sel == 6: root.destroy() root=Tk() root.geometry('600x400+400+20') mylistbox=Listbox(root,width=30,height=10,font='Arial 16') mylistbox.grid(column=0, row=0, rowspan=5) mylistbox.insert(0, *itemsforlistbox) mylistbox.bind('<<ListboxSelect>>', CurSelet) asd1 = StringVar() asd1.set('Первая клетка') lb1 = Label(root, textvar=asd1) lb1.grid(column=1, row=0) asd2 = StringVar() asd2.set('Вторая клетка') lb2 = Label(root, textvar=asd2) lb2.grid(column=1, row=1) asd3 = StringVar() asd3.set('Третья клетка') lb3 = Label(root, textvar=asd3) lb3.grid(column=1, row=2) root.mainloop()
Офлайн
27
Если не ошибаюсь, то значение надо передать какой-либо функции после закрытия окна?
Если так, то
from tkinter import* root=Tk() sizex = 600 sizey = 400 posx = 40 posy = 20 root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) itemsforlistbox=['one','two','three','four','five','six','seven'] var = IntVar() # Объявим переменную для возврата значения def CurSelet(i): widget = i.widget selection=widget.curselection() i=(selection[0]) var.set(i) # Запишем в переменную значение выбранного # print(i) root.destroy() # Закроем список mylistbox=Listbox(root,width=60,height=10,font=('times',13)) mylistbox.bind('<<ListboxSelect>>',CurSelet) mylistbox.place(x=32,y=90) for items in itemsforlistbox: mylistbox.insert(END,items) root.mainloop() # Передадим любой функции, например print-у, полученное значение print(var.get())
Офлайн
0
ramiКруто, сделал на основе вашего примера, добавил функцию в функцию. Спасибо за уделенное время и помощь
Вместо раскрашивания клеток можно выполнить любое другое действие.


Офлайн
0
RafikДа! этот вариант изначально пробовал, у меня не получалось, спасибо, теперь буду уметь и это)
Если не ошибаюсь, то значение надо передать какой-либо функции после закрытия окна?
Офлайн