python tkinter 问题(多个Listbox选取显示问题,虚拟事件的特点为何虚拟,listbox.nearest函数与虚拟事件绑定返回值错误,StringVar类参数调用时单向性,线程无响应)

多个Listbox选取显示问题:结论是无论在同一个容器控件中(Frame,LabelFrame控件)还是在不同的容器控件中。不会同时显示出多个框中的内容,且如果一个被选取,另一个框中的选取项就消失掉。tkinter工具特点。

 

listbox.nearest(event.y)与不同事件绑定效果:

  # 有省略的地方

  def show_y(event, listbox):
    print(listbox.nearest(event.y))
  ...
  l1 = listbox(...)
  l1.bind('<Button-1>', lambda event, listbox=l1: show_y(event, l1))

与Button-1和Double-1都会显示选定项目的索引作为返回值;而绑定事件为ListboxSelect时,不论怎么点都返回0,它总是很特殊,需留意。
该函数正常时的效果为返回事件绑定(一般就是鼠标点击event)时的那个索引,但它实际上并不是只返回一个索引,如果不点击到某一项上面,
它还会把最近的那个项目给选取。

虚拟事件的特点为何虚拟:

---凡是对控件进行同样的操作的行为都可以触发一次该事件,就是该控件绑定虚拟事件之后。比如说有Listbox类型的A, A.bind('<<ListboxSelect>>',funB)之后。

如果在某个函数中对A的项进行选取A.selection_set(index),它就会触发funB。

 

StringVar类参数调用时单向性:

tkinter中的很多控件往往都需要一个变量来显示文字内容,比如Button,Label,Entry等等。其中要用到StringVar,IntVar等函数构造出的对象。比如:

  from tkinter import *
  t = Tk()
  t.geometry("500x500+500+150")
  def retr_message(widge):
  print(widge['textvariable'])
  e_str = StringVar()
  e = Entry(t, bg='Magenta', width=20, textvariable=e_str)
  e.pack(side=TOP, fill=X, )
  b = Button(t, text='click', command=lambda: retr_message(e))
  b.pack()
  t.mainloop()

函数retr_message():想返回传入Entry控件显示的文字内容
输出为:PY_VAR0 print的类型为str,不能get() 如果不使用StringVar类型e_str.get(),则不能显示该控件的值
总结就是:从控件方向来显示,此路不通;很不符合编程特性的要去找给控件赋值的StringVar类型,
但这可能就是tkinter式处理吧。

 

tkinter中开启线程无响应问题
Thread().join()该句线程关闭语句在root.mainloop()之前执行就会导致线程无响应。不写反而对。

 

原文地址:https://www.cnblogs.com/s1mplelectronic/p/13972127.html