多个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()之前执行就会导致线程无响应。不写反而对。