Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 18, 2018 15:41:43

wartes
Зарегистрирован: 2018-10-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

возвращение переменной

Помогите пожалуйста, нужно вернуть переменную 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)

Офлайн

#2 Окт. 18, 2018 16:29:09

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

возвращение переменной

Ваш вопрос не понятен, вы хотите получить не номер выбранного элемента в списке, а сам выбранный элемент ('one','two','three' и т.д.) ? Если да, то перепишите функцию CurSelet:

 def CurSelet(i):
    widget = i.widget
    selection=widget.selection_get()
    print(selection)

Офлайн

#3 Окт. 18, 2018 16:51:12

wartes
Зарегистрирован: 2018-10-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

возвращение переменной

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

Отредактировано wartes (Окт. 18, 2018 16:54:22)

Офлайн

#4 Окт. 18, 2018 20:47:56

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

возвращение переменной

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()

Офлайн

#5 Окт. 18, 2018 21:38:40

wartes
Зарегистрирован: 2018-10-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

возвращение переменной

rami
Переменная mylistbox содержит в себе всё что связано со списком, в том числе что выделено в данный момент. Создавать специальную функцию для этого не нужно, из любой другой функции можно получить номер выделенной записи. В примере выбирайте запись в списке и жмите на кнопку:
А возможно как либо записать в переменную лишь выделенное?
В вашем примере тоже только вывод на экран, но неужели невозможно в дальнейшем коде использовать этот выбор? Мне нужно использовать в дальнейшем коде эту переменную…
В дальнейшем хочу что то типа“если в этом списке выбрано это, то делаем тото, а если выбрано другое, делаем другое”

Офлайн

#6 Окт. 18, 2018 22:03:59

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

возвращение переменной

wartes
В вашем примере тоже только вывод на экран
Я вывожу на экран потому, что не знаю что ещё делать, вместо вывода на экран можно делать что угодно. Давайте пример (и описание словами), что нужно делать.

Офлайн

#7 Окт. 18, 2018 22:45:14

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

возвращение переменной

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()


Вместо раскрашивания клеток можно выполнить любое другое действие.

Офлайн

#8 Окт. 19, 2018 08:31:07

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

возвращение переменной

Если не ошибаюсь, то значение надо передать какой-либо функции после закрытия окна?
Если так, то

 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())

Офлайн

#9 Окт. 19, 2018 09:14:55

wartes
Зарегистрирован: 2018-10-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

возвращение переменной

rami
Вместо раскрашивания клеток можно выполнить любое другое действие.
Круто, сделал на основе вашего примера, добавил функцию в функцию. Спасибо за уделенное время и помощь
плюсую в карму

Офлайн

#10 Окт. 19, 2018 09:16:28

wartes
Зарегистрирован: 2018-10-16
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

возвращение переменной

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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version