tkinter Entry 小部件中的可见文本变量
Posted
技术标签:
【中文标题】tkinter Entry 小部件中的可见文本变量【英文标题】:Visible textvariable in tkinter Entry widget 【发布时间】:2014-02-20 16:23:00 【问题描述】:我在使用 tkinter 中的输入框小部件时遇到问题。当用户选择 Edit -> Backbone... 时,我希望打开一个新窗口。在此窗口中将有许多 Entry 小部件(为简单起见,下面仅对其中一个进行了编码),它们显示了存储在类 Elements 的各种实例中的默认字符串。用户应该能够编辑此字符串并通过单击确定将其保存并通过单击默认值将其恢复为默认值。每次重新打开主干编辑器时,输入框应始终显示变量的当前值(如果整个程序重新启动,则不需要记住用户输入)。
打开“主干编辑器”窗口后,输入框应该显示字符串文本变量,但我无法让它出现。
from tkinter import *
from tkinter import ttk
class View(ttk.Frame):
"""Main GUI class"""
def __init__(self, master = None):
self.WIDTH = 450
self.HEIGHT = 500
self.lib = MolecularLibrary()
# Set up the main window
ttk.Frame.__init__(self, master, borderwidth=5, width=self.WIDTH, height=self.WIDTH)
self.master.resizable(FALSE, FALSE)
self.grid(column=0, row=0, sticky=(N, S, E, W))
self.columnconfigure(0, weight=1)
self.create_menus()
def create_menus(self):
"""Produces the menu layout for the main window"""
self.master.option_add('*tearOff', FALSE)
self.menubar = Menu(self.master)
self.master['menu'] = self.menubar
# Menu Variables
menu_edit = Menu(self.menubar)
# Add the menus to the menubar and assign their variables
self.menubar.add_cascade(menu=menu_edit, label = "Edit")
### Edit ###
menu_edit.add_command(label="Backbone...", command=lambda : self.edit_backbone())
def edit_backbone(self):
"""Shows a window where the backbone constituents can be edited"""
backbone_window = Toplevel(borderwidth = 5)
backbone_window.title("Backbone Editor")
backbone_window.resizable(FALSE, FALSE)
print("sugar value", self.lib.sugar_var)
# LABELS FOR BACKBONE #
# Phosphate annotations and input
sugar_label = ttk.Label(backbone_window, text = "Sugar")
#inputs
sugar = ttk.Entry(backbone_window, textvariable = self.lib.sugar_var, justify = 'center', width=10)
### Buttons ###
default = ttk.Button(backbone_window, text = "Defaults", command=lambda : defaults())
okay = ttk.Button(backbone_window, text = "Okay", command=lambda : okay())
cancel = ttk.Button(backbone_window, text = "Cancel", command=lambda : backbone_window.destroy())
#content.grid(column=0, row=0)
sugar_label.grid(column=2, row=1)
sugar.grid(column=1, row=2, columnspan=3)
default.grid(column=0, row=12, columnspan=3, pady=2)
okay.grid(column=6, row=12, columnspan=3, pady=2)
cancel.grid(column=9, row=12, columnspan=4, pady=2)
backbone_window.focus()
def defaults():
"""Reset the backbone and bases to their defaults."""
self.lib.set_molecules()
def okay():
"""Set the backbone and base variables to the user set values."""
self.lib.sugar_var.new_formula(sugar.get())
backbone_window.destroy()
class MolecularLibrary:
"""
"""
def __init__(self, atom_file = r'C:\MyPyProgs\OSeq\resources\ATOMS.txt',
precision = 4):
self.molecules =
self.atom_file = atom_file
# self.molecule_file = molecule_file
# Variables
self.set_molecules()
def set_molecules(self):
"""
Set all of the molecules for the backbone and bases to their default values and forumlae.
"""
### Sugar ###
self.sugar_var = Element('C5H8O3', 'A')
def add_molecule(self, molecule):
"""(MolecularLibrary, list) -> None
Returns a dictionary of the molecule name as an Element
molecule[0]: Element
"""
print(molecule)
tmp = self.get_mass(molecule[1])
return molecule[0]: Element(molecule[1], molecule[0], tmp[0], tmp[0])
class Element:
"""
Creates an element with the following construct:
[symbol, name, monoisotopic, average]
"""
def __init__(self, symbol, name):
self.symbol = symbol
self.name = name
def __str__(self):
return str([self.symbol, self.name])
def get_name(self):
"""Returns the name of the Element"""
return self.name
def get_symbol(self):
"""Returns the symbol of the Element"""
return self.symbol
def new_formula(self, new_formula):
"""replace the formula with new_formaula and recalculate the
average and monoisotopic masses."""
self.symbol = new_formula
if __name__ == "__main__":
root = Tk()
root.title("Sequencer")
view = View(root)
root.mainloop()
上面的代码是我的程序的一个严重剥离的版本,但具有相同的基本架构。恐怕还有很多代码,我通常会尝试更多地删除它,但我不确定我遇到的问题是否来自架构。
【问题讨论】:
【参考方案1】:为了使用textvariable
属性,你必须给它一个tkinter变量的实例:StringVar
、IntVar
、BooleanVar
或DoubleVar
了解更多关于这些变量的良好起点是:http://effbot.org/tkinterbook/variable.htm
【讨论】:
我之前尝试过,但在同一函数中定义输入框之前分配时它不起作用。我尝试了一个新的实现,其中 Element 类将其字符串存储为 StringVars,它现在可以工作了。在 Element 类中定义 StringVars 是一种更好的方法!非常感谢您的帮助!以上是关于tkinter Entry 小部件中的可见文本变量的主要内容,如果未能解决你的问题,请参考以下文章