У меня проблемы со stringVars от TK.
from tkinter import *
root = Tk()
strVar = StringVar()
tmp1 = ['one','two','three']
print(tmp1)
print(len(tmp1))
strVar.set(tmp1)
tmp2=strVar.get()
print(tmp2)
print(len(tmp2))
Выход:
['one', 'two', 'three']
3
('one', 'two', 'three')
23
Как видите, формат другой. Очевидно, что список строк внутренне преобразуется в одну строку с кавычками. В чем причина и как ее избежать? Для моего скрипта я хотел бы иметь список строк для дальнейшей обработки.
Почему вы чувствуете, что вам нужно хранить список строк в StringVar? Что плохого в использовании обычного списка Python?
Лучше всего было бы просто попросить пользователя ввести несколько строк, разделенных каким-либо специальным символом (пробел, запятая, точка с запятой и т. д.), А затем str.split, соответственно, значение strVar.get(). Это даже проще, чем вводить все эти [, ' и т. д.
Привет, спасибо за ответы, я должен признать, что я новичок в python и особенно в TK. Фон состоит в том, что я получаю список строк из системной команды, например result = subprocess.run (['...']). Stdout.decode ('ascii'), который я передаю в список через StringVar. Позже я хочу получить данные из этой StringVar, чтобы использовать их в дальнейшем.
@Jensenmann: вам не нужно использовать StringVar для перемещения данных в список и из него.
Спасибо, Брайан, я проверю это еще раз. Мое наблюдение заключалось в том, что Listbox не обновляется, когда установлена переменная, которая не является одним из классов TK. Любая другая переменная (python), назначенная переменной listvariable, не будет обновлять содержимое, потому что она не отслеживается effbot.org/tkinterbook/variable.htm






from tkinter import *
import ast
root = Tk()
strVar = StringVar()
tmp1 = ['one','two','three']
print(type(tmp1), tmp1, len(tmp1))
strVar.set(tmp1)
x = ast.literal_eval('[' + strVar.get()[1:-1] + ']')
print(type(x), x, len(x))
Привет, спасибо за сообщение. Даже если это работает, мне кажется, не очень чисто. Фон состоит в том, что я получаю список строк из системной команды, такой как результат = subprocess.run (['...']). stdout.decode ('ascii'), которую я передаю в список через StringVar. Теперь я узнал, что StringVar не предназначен для хранения каких-либо списков, поэтому я думаю, что мне лучше сохранить список в отдельной переменной списка Python и просто преобразовать список в строку, прежде чем устанавливать stringvar для списка.
@Jensenmann, Привет, это именно то, что я пытаюсь сделать. Вы нашли хорошее решение?
@ tjt263, пожалуйста, найдите мой ответ выше
@ tjt263, это было очень давно, но я думаю, что решил как
fdupesSV.set(fdupesList)
tmp = subprocess.run(['fdupes', '-r',directory.get()], stdout=subprocess.PIPE)
#first convert bytes to ascii, then split at '\n', then assign so fdupesOut
fdupesList=tmp.stdout.decode('ascii').split('\n')
fdupesSV.set(fdupesList)
Я не уверен, правильно ли я помню проблему, но надеюсь, что это поможет вам
Ваше здоровье Йенс
Хотя идея присвоить список строковой переменной забавна, это на самом деле неплохой вопрос: что там происходит является? Почему список сначала преобразуется в кортеж, а затем в строку? Например. если вы передадите число или словарный запас в строку var, они будут преобразованы в str Только.