Python 将dict[key]循环到gui界面,移除和替换
因此,我有这段用于Python2.7的代码,它计算单词频率(欢迎进行任何优化) 现在,问题是显示Python 将dict[key]循环到gui界面,移除和替换,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,因此,我有这段用于Python2.7的代码,它计算单词频率(欢迎进行任何优化) 现在,问题是显示 print value_alphabet[key], ',', key, '-', float(value_alphabet[key])/count*100, '%' 在Tkinter标签或任何其他适当的Tkinter小部件中,我想知道如何在循环中主动编辑标签,如果user\u input变量更改,将其删除,并且(这应该是自然的)在user\u input中显示新条目的信息(e在“e.get()之
print value_alphabet[key], ',', key, '-', float(value_alphabet[key])/count*100, '%'
在Tkinter标签或任何其他适当的Tkinter小部件中,我想知道如何在循环中主动编辑标签,如果user\u input
变量更改,将其删除,并且(这应该是自然的)在user\u input
中显示新条目的信息(e
在“e.get()之前)
”部分)
(也就是说,如果你输入“banana”,你应该得到a-50%、n-33.333333%、b-16.6666666%……这是词频)设置标签时,你可以给它一个
tkinter.StringVar
作为文本变量。然后,无论何时更新变量,标签都将自动更新:
from tkinter import *
from time import sleep
root = Tk()
labeltext = StringVar()
labeltext.set('hello')
label = Label(root, textvariable = labeltext)
label.pack()
for i in range(10):
labeltext.set(str(i))
root.update_idletasks()
sleep(1) #slow it down so that the changes are visible
此代码将更新for循环内的标签。现在,您只需要
labeltext.set(str(user_input))
就可以在标签上获得用户输入。设置标签时,可以将tkinter.StringVar
作为文本变量。然后,无论何时更新变量,标签都将自动更新:
from tkinter import *
from time import sleep
root = Tk()
labeltext = StringVar()
labeltext.set('hello')
label = Label(root, textvariable = labeltext)
label.pack()
for i in range(10):
labeltext.set(str(i))
root.update_idletasks()
sleep(1) #slow it down so that the changes are visible
此代码将更新for循环内的标签。现在,您只需
labeltext.set(str(user_input))
就可以在标签上获得用户输入。在着手解决问题之前,对函数进行一些调整。你正在做很多你不需要做的事情,并且可以减少很多
首先,您的
值\u字母表
只是一个重新实现的集合。计数器
。用它来代替
from collections import Counter
...
value_alphabet = Counter()
您还做了一些A)在Python中不必要的低级工作,B)在Python中做这些工作不是最好的方法,即使这是必要的。我是说
letters = []
for character in user_input:
letters.append(character)
这只是
letters = list(user_input)
但是,由于可以直接在字符串上迭代,因此根本不需要字母。移除它。类似地,count
只是len(用户输入)
。你所要做的就是把每个字母圈起来数一数。扔掉它。现在,您的函数如下所示:
def let_freq():
user_input = e.get()
alphabet = {
'a': 0,'b': 1,'c': 2,'d': 3,
'e': 4,'f': 5,'g': 6,'h': 7,
'i': 8,'j': 9,'k': 10,'l': 11,
'm': 12,'n': 13,'o': 14,'p': 15,
'q': 16,'r': 17,'s': 18,'t': 19,
'u': 20,'v': 21,'w': 22,'x': 23,'y': 2,'z': 25}
value_alphabet = Counter()
for item in user_input:
for key,val in alphabet.items():
if key is item:
value_alphabet[key] += 1
那里的环很难看。你忽略了字典最好的部分:O(1)查找!你不需要做双循环if key is item
由于其他原因是不好的,但我不会在这里讨论这个问题,因为身份与平等并不是真的处于同一个水壶中(并且它不会影响这里的功能。只需知道“somestring就是somestring”并不总是True
)
如果您担心用户输入包含无效字符,请使用dict.get
将默认值设置为零
for ch in user_input:
value_alphabet += alphabet.get(ch, 0)
# if ch isn't in alphabet, do value_alphabet += 0
好极了!我们现在差不多分类了。让我们继续。由于我们已经去掉了count
变量,我们可以跳过下一个键入值字母循环,因为它只填充count
。对于最后一点,您可以通过以下操作缩短代码:
for key,val in sorted(value_alphabet.items()):
if val > 0:
print val, ',', key, '-', float(val * 100 / len(user_input)), '%'
现在问你关于更改标签的问题?你正在寻找回电。你应该把它滚到它自己的类中,而不是让它挂在无处的地方,但是让我们来讨论把回调绑定到用户条目的改变。最简单的方法是使用tk.StringVar
及其trace
方法
root = tk.Tk()
e_stringvar = tk.StringVar()
e = tk.Entry(root, textvariable=e_stringvar)
e_stringvar.trace('w', some_func)
这将e_stringvar
与您的tk.Entry
小部件绑定在一起,将e
的内容存储在e_stringvar
中。此外,它还将一些未知函数some_func
绑定到e_stringvar
,这样每当e_stringvar
写入某些内容时(例如e
由于用户输入而更改),它都会调用some_func
。我们可以将some_func
定义为:
f = tk.Label(root)
f.pack()
e.pack() # whatever, pack everything
def some_func(*args, **kwargs):
text = e_stringvar.get()
f.configure(text=text)
# change the f label so it's displaying the same text as the entry
我定义了some_func
来获取参数,因为我真的忘记了tk.StringVar.trace
回调函数是否传递了触发它们的事件。我们没有使用它们,但是如果你不允许它通过,你会得到错误
我最近写了一些(Py3)代码,它使用这个概念跟踪tk.Entry
字段,并使用它过滤文本列表。相关代码位于bitbucket(FilterFrame类)和(第38行实例化FilterFrame并命名其回调函数)在讨论当前问题之前对函数进行一些调整。你正在做很多你不需要做的事情,并且可以减少很多
首先,您的值\u字母表
只是一个重新实现的集合。计数器
。用它来代替
from collections import Counter
...
value_alphabet = Counter()
您还做了一些A)在Python中不必要的低级工作,B)在Python中做这些工作不是最好的方法,即使这是必要的。我是说
letters = []
for character in user_input:
letters.append(character)
这只是
letters = list(user_input)
但是,由于可以直接在字符串上迭代,因此根本不需要字母。移除它。类似地,count
只是len(用户输入)
。你所要做的就是把每个字母圈起来数一数。扔掉它。现在,您的函数如下所示:
def let_freq():
user_input = e.get()
alphabet = {
'a': 0,'b': 1,'c': 2,'d': 3,
'e': 4,'f': 5,'g': 6,'h': 7,
'i': 8,'j': 9,'k': 10,'l': 11,
'm': 12,'n': 13,'o': 14,'p': 15,
'q': 16,'r': 17,'s': 18,'t': 19,
'u': 20,'v': 21,'w': 22,'x': 23,'y': 2,'z': 25}
value_alphabet = Counter()
for item in user_input:
for key,val in alphabet.items():
if key is item:
value_alphabet[key] += 1
那里的环很难看。你忽略了字典最好的部分:O(1)查找!你不需要做双循环if key is item
由于其他原因是不好的,但我不会在这里讨论这个问题,因为身份与平等并不是真的处于同一个水壶中(并且它不会影响这里的功能。只需知道“somestring就是somestring”并不总是True
)
如果您担心用户输入包含无效字符,请使用dict.get
将默认值设置为零
for ch in user_input:
value_alphabet += alphabet.get(ch, 0)
# if ch isn't in alphabet, do value_alphabet += 0
好极了!我们现在差不多分类了。让我们继续。由于我们已经去掉了count
变量,我们可以跳过下一个键入值字母循环,因为它只填充count
。对于最后一点,您可以通过以下操作缩短代码:
for key,val in sorted(value_alphabet.items()):
if val > 0:
print val, ',', key, '-', float(val * 100 / len(user_input)), '%'
现在来听你的