Python назначает список для tk stringvar

У меня проблемы со 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

Как видите, формат другой. Очевидно, что список строк внутренне преобразуется в одну строку с кавычками. В чем причина и как ее избежать? Для моего скрипта я хотел бы иметь список строк для дальнейшей обработки.

Хотя идея присвоить список строковой переменной забавна, это на самом деле неплохой вопрос: что там происходит является? Почему список сначала преобразуется в кортеж, а затем в строку? Например. если вы передадите число или словарный запас в строку var, они будут преобразованы в str Только.

tobias_k 01.10.2018 17:51

Почему вы чувствуете, что вам нужно хранить список строк в StringVar? Что плохого в использовании обычного списка Python?

Bryan Oakley 01.10.2018 19:33

Лучше всего было бы просто попросить пользователя ввести несколько строк, разделенных каким-либо специальным символом (пробел, запятая, точка с запятой и т. д.), А затем str.split, соответственно, значение strVar.get(). Это даже проще, чем вводить все эти [, ' и т. д.

tobias_k 01.10.2018 19:52

Привет, спасибо за ответы, я должен признать, что я новичок в python и особенно в TK. Фон состоит в том, что я получаю список строк из системной команды, например result = subprocess.run (['...']). Stdout.decode ('ascii'), который я передаю в список через StringVar. Позже я хочу получить данные из этой StringVar, чтобы использовать их в дальнейшем.

Jensenmann 02.10.2018 08:10

@Jensenmann: вам не нужно использовать StringVar для перемещения данных в список и из него.

Bryan Oakley 02.10.2018 14:39

Спасибо, Брайан, я проверю это еще раз. Мое наблюдение заключалось в том, что Listbox не обновляется, когда установлена ​​переменная, которая не является одним из классов TK. Любая другая переменная (python), назначенная переменной listvariable, не будет обновлять содержимое, потому что она не отслеживается effbot.org/tkinterbook/variable.htm

Jensenmann 03.10.2018 10:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
939
2

Ответы 2

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 02.10.2018 08:20

@Jensenmann, Привет, это именно то, что я пытаюсь сделать. Вы нашли хорошее решение?

voices 02.10.2019 09:45

@ tjt263, пожалуйста, найдите мой ответ выше

Jensenmann 02.10.2019 13:52

@ 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)

Я не уверен, правильно ли я помню проблему, но надеюсь, что это поможет вам

Ваше здоровье Йенс

Другие вопросы по теме