首页 > 解决方案 > 将 StringVar 值转换为列表

问题描述

我一直在从事 Tkinter 项目。我已将列表框设置为 StringVar,我想通过设置一个函数来调用右侧列表框中的项目列表'process'

在此处输入图像描述

在我按下 gui 中的按钮过程后,我应该['A']在上述情况下返回一个列表。然而,它返回['(', "'", 'A', "'", ')']

如果我只是print app.list_var2.get()返回('A',)

import tkinter as tk
import pandas as pd

app=tk.Tk()
app.geometry('640x480')
app.resizable(width=True, height=True)
app.title('Simulator')

# list variables
app.list_var1 = tk.StringVar()
app.list_var2 = tk.StringVar()
app.list_var1.set(value=['A','B','C'])
app.list_var2.set(value=[])

# label frame
app.label_frame= tk.Frame(app)
app.label1 = tk.Label(app.label_frame,text='PDC',justify='left')
app.label1.pack(ipadx=10,ipady=10,side='left', anchor='w')
app.label2 = tk.Label(app.label_frame,text='SDC')
app.label2.pack(ipadx=20,ipady=10, side='left',anchor='e')

# main frame
app.main_frame = tk.Frame(app)
app.listbox1 = tk.Listbox(app.main_frame, listvariable=app.list_var1, selectmode='single')
app.listbox2 = tk.Listbox(app.main_frame, listvariable=app.list_var2, selectmode='single')

def init_default_values():
    app.list_var1.set(value=['A','B','C'])
    app.list_var2.set(value=[])


def move_to_right(only_one_item=False):
    if app.listbox1.curselection() == ():
        return

    # get tuple of selected indices
    if only_one_item:
        selection = (app.listbox1.curselection()[0],)
    else:
        selection = app.listbox1.curselection()

    # left all/selected values
    left_value_list = [line.strip(' \'') for line in app.list_var1.get()[1:-1].split(',')]
    left_selected_list = [left_value_list[index] for index in selection]
        
    # values from right side
    right_value_list = [line.strip(' \'') for line in app.list_var2.get()[1:-1].split(',')]

    # merge w/o duplicates
    result_list = sorted(list(set(right_value_list + left_selected_list)))
        
    for x in left_value_list:
        if x in result_list:
            left_value_list.remove(x)
    
    while("" in left_value_list) : 
        left_value_list.remove("")
    
    while("" in result_list) : 
        result_list.remove("")
        
    app.list_var2.set(value=result_list)
        
    app.list_var1.set(value=left_value_list)

def move_to_left(only_one_item=False):

    if app.listbox2.curselection() == ():
        return

    # get tuple of selected indices
    if only_one_item:
        selection = (app.listbox2.curselection()[0],)
    else:
        selection = app.listbox2.curselection()

    # right all/selected values
    right_value_list = [line.strip(' \'') for line in app.list_var2.get()[1:-1].split(',')]
    right_selected_list = [right_value_list[index] for index in selection]

    # values from left side
    left_value_list = [line.strip(' \'') for line in app.list_var1.get()[1:-1].split(',')]

    # merge w/o duplicates
    result_list = sorted(list(set(left_value_list + right_selected_list)))
        
    for x in right_value_list:
        if x in result_list:
            right_value_list.remove(x)
            
    while("" in right_value_list) : 
        right_value_list.remove("")
    
    while("" in result_list) : 
        result_list.remove("")
    
    app.list_var1.set(value=result_list)
        
    app.list_var2.set(value=right_value_list)

def reset():
    init_default_values()


def process():
    
    #if len(app.list_var2.get()) == 1:
    lst=app.list_var2.get()
    print(len(lst))
    lst = str(app.list_var2.get()).replace(',','')
    lst=list(lst)
       
    print(type(lst))
    print(len(lst))
    print(lst)

# little button frame
app.button_frame = tk.Frame(app.main_frame)

app.one_to_right_button = tk.Button(app.button_frame, text='>', command=lambda: move_to_right(True))
app.one_to_left_button = tk.Button(app.button_frame, text='<', command=lambda: move_to_left(True))
app.reset_button = tk.Button(app.button_frame,text='Reset',command=reset)
app.process = tk.Button(app.button_frame,text='Process',command=process)

# packing
app.one_to_right_button.pack()
app.one_to_left_button.pack()
app.reset_button.pack()
app.process.pack()

app.listbox1.pack(side='left', anchor='w')
app.button_frame.pack(side='left')
app.listbox2.pack(side='right', anchor='e')
        
app.label_frame.pack()
app.main_frame.pack(padx=20,pady=20)

# insert default values
init_default_values()
        
app.mainloop()

标签: pythonstringlisttkintertuples

解决方案


因为app.list_var2是 a StringVar,所以app.list_var2.get()总是会返回一个字符串。

更好地app.listbox2.get(0, "end")用于获取列表框中的所有项目(元组):

def process():
    lst = list(app.listbox2.get(0, 'end'))
    print(lst, type(lst))

请注意,您可以使用eval()to 转换返回的字符串app.list_var2.get()tuple但不建议这样做:

def process():
    lst = list(eval(app.list_var2.get()))
    print(lst, type(lst))

推荐阅读