Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将dict[key]循环到gui界面,移除和替换_Python_Python 2.7_Tkinter - Fatal编程技术网

Python 将dict[key]循环到gui界面,移除和替换

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()之

因此,我有这段用于Python2.7的代码,它计算单词频率(欢迎进行任何优化)

现在,问题是显示

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)), '%'

现在来听你的