我写了下面的tkinter脚本以了解如何将数据列表添加到tkinter.Listbox小部件中。我发现有两种方法可以实现。
接下来,我想从tkinter.Listbox小部件中提取相同的列表。在4种不同的方法中,我只成功让第4种方法(即e4)起作用。
如何让e1、e2和e3方法起作用?最终目标是获取最初提供给tkinter.Listbox小部件的相同列表。
测试脚本:
接下来,我想从tkinter.Listbox小部件中提取相同的列表。在4种不同的方法中,我只成功让第4种方法(即e4)起作用。
如何让e1、e2和e3方法起作用?最终目标是获取最初提供给tkinter.Listbox小部件的相同列表。
测试脚本:
import tkinter as tk # Python 3 tkinter modules
import tkinter.ttk as ttk
class App(ttk.Frame):
def __init__(self, parent, *args, **kwargs):
# 1. Initialise Frame
ttk.Frame.__init__(self, parent)
self.parent = parent
# Method1
name1 = ['Peter', 'Scotty', 'Walter', 'Scott', 'Mary']
self.lb1_values = tk.StringVar(value=name1)
self.listbox1 = tk.Listbox(self, listvariable=self.lb1_values)
# Method2
self.listbox2 = tk.Listbox(self)
name2 = ['Sarah', 'Sean', 'Mora', 'Mori', 'Mary']
for item in name2:
self.listbox2.insert(tk.END, item)
self.listbox1.grid(in_=self, row=0, column=0, sticky='nsew')
self.listbox2.grid(in_=self, row=0, column=1, sticky='nsew')
# Extract values from listbox and covert to a list
e1 = self.lb1_values.get()
print('e1 = ', e1)
print('type(e1) = ', type(e1))
e1 = e1.strip(',')
print('e1 = ', e1)
e2 = self.listbox1.cget('listvariable')
print('\ne2 = ', e2)
print('type(e2) = ', type(e2))
e2 = e2.split(',')
print('e2 = ', e2)
e3 = self.listbox2.cget('listvariable')
print('\ne3 = ', e3)
print('type(e3) = ', type(e3))
e4 = self.listbox2.get(0, tk.END)
print('\ne4 = ', e4)
print('type(e4) = ', type(e4))
e4 = list(e4)
print('e4 = ', e4)
if __name__ == '__main__':
root = tk.Tk()
root.title('App'), root.geometry('400x200')
app = App(root)
app.grid(row=0, column=0, sticky='nsew')
#root.mainloop()
输出:
e1 = ('Peter', 'Scotty', 'Walter', 'Scott', 'Mary')
type(e1) = <class 'str'>
e1 = ('Peter', 'Scotty', 'Walter', 'Scott', 'Mary')
e2 = PY_VAR0
type(e2) = <class 'str'>
e2 = ['PY_VAR0']
e3 =
type(e3) = <class 'str'>
e4 = ('Sarah', 'Sean', 'Mora', 'Mori', 'Mary')
type(e4) = <class 'tuple'>
e4 = ['Sarah', 'Sean', 'Mora', 'Mori', 'Mary']
PY_VAR
是内部 tcl 变量的名称,因此您可以依赖globalgetvar
函数来检索值。例如:print(list(self.tk.globalgetvar(self.listbox1.cget('listvariable'))))
。 - CommonSenseget
的结果实际上是globalgetvar
函数转换为str
,因此请考虑覆盖此函数。 - CommonSenseStringVar
,因为 New Mexico Tech 在tk.Listbox
小部件的listvariable
选项中教授了这种方法。tk.Listbox
确实可以获取这些值。我希望我已经正确理解了你的问题和 New Mexico Tech 的指示。我刚刚发现了tk.Variable
的存在以及它与tk.StringVar
的区别。 - Sun Beartk.Variable
(在Bryan的回答中提出)可能是最好的选择,因为Bryan Oakley是该主题上最资深的程序员之一,如果不是最资深的话(至少我知道的是这样)。 - Nae