【问题标题】:How can I update a tkinter Label with every new selection in Listbox?如何使用列表框中的每个新选择更新 tkinter 标签?
【发布时间】:2019-12-20 15:37:48
【问题描述】:

我希望在选择列表框中的名称时更新右侧的标签。选择列表中的新名称时,右侧的名称标签保持不变。

我直接在 student_name.set() 中尝试 name_list.index(ACTIVE)student_name.set(students_list[name_list.index(ACTIVE)].get_name())。恐怕它只是使用索引 0,甚至没有使用主动选择。

from tkinter import *

# Defining Student class
class Student:

  def __init__(self, name, instrument=""):
    self.name = name
    self.instrument = instrument

  def get_name(self):
    return self.name

  def get_instrument(self):
    return self.instrument

# Creating Student objects and list
s1 = Student("Seth", "Trumpet")
s2 = Student("Cassie", "Flute")
s3 = Student("Cody", "Guitar")
students_list = [s1, s2, s3]

# GUI created
def make_window():
  rootWindow = Tk()
  rootWindow.title("Instructor Database Application")
  rootWindow.grid()

  frame0 = Frame(rootWindow)
  frame0.grid(column=0, row=0, padx=20, pady=20)

  name_list = Listbox(frame0, height=10)
  name_list.grid(column=0, row=0)
  for Student in students_list:
    name_list.insert(END, Student.get_name())

  frame1 = Frame(rootWindow)
  frame1.grid(column=1, row=0, padx=20, pady=20)

  student_index = name_list.index(ACTIVE)
  student_name = StringVar()
  student_name.set(students_list[student_index].get_name())

  name_label = Label(frame1, textvariable=student_name)
  name_label.grid(column=0, row=0)

  instrument_label = Label(frame1, text="Instrument")
  instrument_label.grid(column=0, row=1)

  return rootWindow

def main():
  app = make_window()
  app.mainloop()

main()

程序以名字开头,无法更改。有什么建议吗?

【问题讨论】:

  • mainloop 之前的所有代码甚至在你看到 window 之前就被执行了——而且它只执行一次。您必须绑定到列表功能,该功能将在您每次选择列表中的元素时执行,并且此功能必须更改标签。
  • @furas 好的。我正在理解这个概念。当我做出新的选择时,你对我应该在哪里或如何调用这个函数有什么建议吗?我不确定如何检测到新选择。
  • stackoverflow.com/questions/6554805/… 似乎有点像解决方法,但我认为这会起作用。谢谢
  • 你在我的回答中有例子。它显示了如何绑定可以在选择新元素时更改值的函数。

标签: python class user-interface tkinter


【解决方案1】:

您必须将函数绑定到listbox,这将在您更改选择时执行。这个函数必须改变标签中的文本

listbox.bind('<<ListboxSelect>>', my_function)

最小的工作示例

import tkinter as tk

# --- function ---

def on_selection(event):
    # here you can get selected element
    print('previous:', listbox.get('active'))
    print(' current:', listbox.get(listbox.curselection()))

    # or using `event`

    #print('event:', event)
    #print('widget:', event.widget)
    print('(event) previous:', event.widget.get('active'))
    print('(event)  current:', event.widget.get(event.widget.curselection()))

    lbl['text'] = "Seleced: " + listbox.get(listbox.curselection())
    print('---')

# --- main ---

root = tk.Tk()

listbox = tk.Listbox(root)
listbox.pack()

listbox.insert(1, 'Hello 1')
listbox.insert(2, 'Hello 2')
listbox.insert(3, 'Hello 3')
listbox.insert(4, 'Hello 4')
listbox.bind('<<ListboxSelect>>', on_selection)

lbl = tk.Label(root, text='?')
lbl.pack()

root.mainloop()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多