текстовые переменные случайно связаны между собой в tkinter - PullRequest
0 голосов
/ 02 февраля 2020

Написание формы для обработки отображения / ввода инвентаря.
Код ниже был спарен почти до нуля. Проблема заключается в том, что у меня есть две переменные STR с 1 символом, которые каким-то образом связаны друг с другом, и я не могу понять, как и почему.

Две переменные вытягивают первую и вторую цифры INT (после преобразования в STR). Если первая и вторая цифры INT совпадают, то две переменные STR становятся связанными - изменение одного отражается в другом. Если две цифры отличаются, то две переменные STR не связаны. Я почти уверен, что делаю что-то глупое, но я этого не вижу. Я попытался переименовать vars, инициализировать, разделить код, убрать все, вплоть до голых, и все же проблема остается. Кто-нибудь хочет сказать мне, какую глупость я делаю?

from tkinter import *

class company_frame(Frame):
    def __init__(self, master):
        super().__init__(master)
        self["height"] = 40
        self["width"] = 1300
        self["relief"] = RAISED
        self["bd"] = 8
        self["bg"] = "#dfdfdf"

def inv_form():
    inv = [22001,"6' CAT6 Patch Cable, Blue",2.50,6.00,"02/01/2020","THD",1,1]
    cf = company_frame(root)
    cf.grid(row=0, column=2)

    class_id = StringVar()
    subclass_id = StringVar()
    item_id = StringVar()

    class_id =  str(inv[2])[0]
    subclass_id = str(inv[0])[1]
    item_id = str(inv[0])[2:5]

    # ENTRY SECTION
    class_e = Entry(cf, textvariable=class_id)
    class_e.delete(0, END)
    class_e.insert(0, class_id)
    class_e.config(width=1)

    subclass_e = Entry(cf, textvariable=subclass_id)
    subclass_e.delete(0, END)
    subclass_e.insert(0, subclass_id)
    subclass_e.config(width=1)

    item_e = Entry(cf, textvariable=item_id)
    item_e.delete(0, END)
    item_e.insert(0, item_id)
    item_e.config(width=3)

    #item num
    class_e.grid(row=3, column=1)
    subclass_e.grid(row=3, column=3)
    item_e.grid(row=3, column=5)
    return

root = Tk()
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
inv_form()
root.mainloop()
'''

Running python 3 on Ubuntu, tkinter is 8.6.
Any light is greatly appreciated.

1 Ответ

0 голосов
/ 02 февраля 2020

Проблема в том, что вы не используете экземпляры StringVar с виджетами ввода. Вы устанавливаете атрибуты textvariable для строк, а не StringVar s. В этом конкретном случае c первые две переменные устанавливаются в строку «2», поэтому tkinter считает, что они являются одной и той же переменной. Третий устанавливается на строку "001", поэтому tkinter считает ее отдельной переменной.

Это потому, что вы создаете экземпляры StringVar, а затем немедленно повторно используете то же имя переменной для извлечения значение (которое является пустой строкой, поскольку вы не установили его для чего-либо еще).

Вам необходимо удалить эти три строки, из-за которых ваши ссылки на экземпляры StringVar будут забыты:

class_id =  str(inv[2])[0]
subclass_id = str(inv[0])[1]
item_id = str(inv[0])[2:5]

Вы также можете удалить следующие строки кода, где вы явно вставляете что-то в виджеты ввода.

class_e.delete(0, END)
class_e.insert(0, class_id)
...
subclass_e.delete(0, END)
subclass_e.insert(0, subclass_id)
...
item_e.delete(0, END)
item_e.insert(0, item_id)

... и затем добавьте эти три строки для инициализации виджетов ввода:

class_id.set(str(inv[2])[0])
subclass_id.set(str(inv[0])[1])
item_id.set(str(inv[0])[2:5])

Хотя вы можете объединить создание переменной и установку значения по умолчанию в одном выражении:

class_id = StringVar(value=str(inv[2])[0])
subclass_id = StringVar(value=str(inv[0])[1])
item_id = StringVar(value=str(inv[0])[2:5])

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

Если вы ожидаете, что сможете получать значения из виджетов в другой функции, вы должны сохранить ссылку либо на сами виджеты, либо на StringVar s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...