2016-01-11 5 views
0

Я создаю простой графический интерфейс с несколькими полями ввода, флажками и т. Д. И столкнулся с очень своеобразным поведением в классе Tkinter.Entry, и мне интересно, если кто-то еще столкнулся с ним и/или если я просто делаю что-то глупое.Weird tk поведение в поле ввода

Я создал простой класс для обертывания каждого объекта Tkinter.Entry и интерфейса. Я хотел бы реализовать способ изменить ширину каждого окна, поэтому я добавил в класс параметр width. Когда я это сделал, все мои ящики стали «связаны», и когда я ввожу в один ящик, я ввожу в каждую коробку. прежде чем я реализовал эту функциональность, она отлично работала, и когда я ее вынимаю, она работает снова. Вот мой класс:

import Tkinter as tk 

class EntryBox: 
    def __init__(self, master, row, column, default_val="", width=20): 
     self.val = tk.StringVar() 
     self.default_val = default_val 
     self.width = width 
     # with the width parameter specified 
     self.e = tk.Entry(master, text="cb_text", textvariable=self.val, width=self.width) 
     # without the width parameter specified (defaults to a width of 20) 
     # self.e = tk.Entry(master, text="cb_text", textvariable=self.val) 
     self.e.grid(row=row, column=column, sticky=tk.E) 
     self.e.insert(0, self.default_val) 

    def get_val(self): 
     return self.val.get() 

    def activate(self): 
     self.e.config(state=tk.NORMAL) 

    def deactivate(self): 
     self.e.config(state=tk.DISABLED) 

    def focus(self): 
     self.e.focus() 

Вот моя программа без ширина параметр включен:

Working Program

Вот моя программа с шириной параметра включены:

Broken Program

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

Вот как я создаю экземпляр каждого объекта (я не подозреваю, что это вопрос, но просто быть тщательным):

import Tkinter as tk 

ip_addr_box = EntryBox(root, 1, 1, default_val="192.168.201.116") 
ip_addr_label = tk.Label(root, text="IP Address").grid(row=1, column=2, sticky=tk.W) 
# set up the IP port entry box 
ip_port_box = EntryBox(root, 2, 1, default_val="8000") 
ip_port_label = tk.Label(root, text="IP port").grid(row=2, column=2, sticky=tk.W) 
# set up the number of plot points scroll box 
# set up the filename entry box 
filename_box = EntryBox(root, 4, 1, default_val="log.xlsx") 
filename_label = tk.Label(root, text="File Name").grid(row=4, column=2, sticky=tk.W) 
# set up how long the test lasts 
meas_time_box = EntryBox(root, 3, 4, default_val="5", width=10) 
meas_time_label = tk.Label(root, text="Measurement Period") 
meas_time_label.grid(row=3, column=5, columnspan=2, sticky=tk.W) 
test_time_box = EntryBox(root, 4, 4, default_val="30", width=10) 
test_time_label = tk.Label(root, text="Test Duration").grid(row=4, column=5, columnspan=2, sticky=tk.W) 

Я думаю, что это странно ошибка в Tkinter или что-то делать с namespaces, о котором я не знаю достаточно.

EDIT: Я обновил код класса, чтобы указать, как я не включаю параметр ширины. Я просто не включаю его в качестве именованного аргумента при вызове tk.Entry.

+0

Просто попробовал еще раз с более неясным именем ('box_width'), и программа по-прежнему демонстрирует это поведение. – TylerH

ответ

1

Удалить атрибут text='cb_text'. Я не знаю, что вы думаете, что делает, но text - это всего лишь аббревиатура от textvariable, поэтому используйте то же самое, что и Entry(..., textvariable='cb_text', textvariable=self.var, ...).

По-видимому, есть ошибка в том, как виджет ввода tkinter обрабатывает именованные аргументы, и он запускается, когда вы добавляете аргумент width. Каждый виджет ввода заканчивается атрибутом textvariable, установленным на "cb_text", что означает, что все они используют одно и то же хранилище для значения.

+0

haha, back, когда я начал работать с Tkinter, я думал, что могу наклеить виджеты Entry, как вы можете, с помощью флажков. Так что старый код остался. Удаление этого исправлено! Большое спасибо. Преподает меня не оставлять в старом кодексе, который, кажется, ничего не делает! – TylerH

-1

Наследование от класса Tkinter Entry хорошо работает. Я немного манипулировал вашим кодом.

import Tkinter as tk 

class EntryBox(tk.Entry): 
    def __init__(self, master, row, column, default_val="", width=20): 
     tk.Entry.__init__(self, master, text="cb_text") 
     self.val = tk.StringVar() 
     self.default_val = default_val 
     self.width = width 
     # with the width parameter specified 
     # self.e = tk.Entry(master, text="cb_text", textvariable=self.val, width=self.width) 
     # without the width parameter specified (defaults to a width of 20) 
     # self.e = tk.Entry(master, text="cb_text", textvariable=self.val) 
     # self.e.grid(row=row, column=column, sticky=tk.E) 
     self.config(textvariable=self.val, width=self.width) 
     self.insert(0, self.default_val) 
     self.grid(row=row, column=column, sticky=tk.E) 


    def get_val(self): 
     return self.val.get() 

    def activate(self): 
     self.e.config(state=tk.NORMAL) 

    def deactivate(self): 
     self.e.config(state=tk.DISABLED) 

    def focus(self): 
     self.e.focus() 

К сожалению, у меня недостаточно комментариев для комментариев.

+0

Просто обновил вопрос, чтобы уточнить. Даже если это было проблемой (ширина только по умолчанию равна 20), это не объясняет проблему с нечетным «все заполнить вместе». Кроме того, вероятно, это комментарий, а не ответ. – TylerH

Смежные вопросы