如何在Entry小部件中打印Python输出?

时间:2018-04-02 12:46:36

标签: python user-interface tkinter widget tkinter-entry

我已经在整个互联网上搜索了如何做到这一点,没有任何事情发生在我身上。当程序员询问如何解析' int'数字到Entry输出。但它更简单,因为你只使用getter,然后插入() - 瞧。

我正在尝试做以下事情。我打印一行写的文字。对于每个单词,我想计算它出现在同一文本中的次数。 例如,我在第一个条目中打印" 一个二一二三" - 我得到" 0 0 1 1 0 "在第二个Entry小部件中。 任何非空格字符序列都被视为单词。

from tkinter import *

class DM_3_1:

def __init__(self):
    root = Tk()
    root.geometry('250x150')
    root.title("DiscreteMaths_3_1")
    usertext = StringVar()

    Label_1 = Label(root, text="Input")
    Label_2 = Label(root, text="Output")
    inputField = Entry(root, textvariable = usertext)
    outputField = Entry(root)

    inputField.bind('<Return>', lambda _: printLine())

    def printLine():
        counter = {}
        for word in inputField.get():
            counter[word] = counter.get(word, 0) + 1
            Ans = print(counter[word] - 1, end=' ')
            outputField.insert(0, str(Ans))

    Label_1.grid(row = 0)
    Label_2.grid(row = 1)

    inputField.grid(row = 0, column = 1)
    outputField.grid(row = 1, column = 1)

    root.mainloop()

DM_3_1()

我现在在输出中得到了什么:Here is the screenshot

据您所知,该应用程序可以运行,但是有“NoNoneNone ...”(取决于字符数,包括空格)而不是&#39; 0 0 1 1 0&#39;。我该如何解决我的问题?哪里出现了逻辑错误?我想,它是关于功能的,但我实际上并没有看到错误。

2 个答案:

答案 0 :(得分:1)

所以我对这种计数器的解决方案是跟踪每个单词并保留所有单词的列表。然后保留所有唯一单词的列表。每次在完整列表中出现唯一单词时计数。

我重新编写了一些代码,以便更好地符合标准。 我重新编写了printLine方法来跟踪字符串中的所有单词并创建一个字典,其中包含所有唯一单词的列表以及它们在字符串中显示的次数。

编写课程时,您需要学习使用self.将标准变量转换为类属性。可以从类中的任何位置访问类属性,包括类中的方法。使用常规变量可能会导致问题,因为__init__完成后方法无法使用它们。

看看下面的代码。

import tkinter as tk

class DM_3_1:
    def __init__(self, parent):
        self.root = parent
        self.root.geometry('250x150')
        self.root.title("DiscreteMaths_3_1")

        Label_1 = tk.Label(self.root, text="Input")
        Label_2 = tk.Label(self.root, text="Output")
        Label_1.grid(row=0)
        Label_2.grid(row=1)

        self.inputField = tk.Entry(self.root)
        self.outputField = tk.Entry(self.root)
        self.inputField.grid(row=0, column=1)
        self.outputField.grid(row=1, column=1)

        self.inputField.bind('<Return>', self.printLine)

    def printLine(self, Event):
        word_list = []
        counter = 0
        unique_words_in_string = []
        total_times_word_appears = {}
        for word in self.inputField.get().split():
            word_list.append(word)
            if word not in unique_words_in_string:
                unique_words_in_string.append(word)

        for word in unique_words_in_string:
            counter = 0
            for other_word in word_list:
                if word == other_word:
                    counter += 1
            total_times_word_appears[word]=counter
        self.outputField.delete(0, "end")
        self.outputField.insert("end", total_times_word_appears)

if __name__ == "__main__":  
    root = tk.Tk()
    DM_3_1(root)
    root.mainloop()

答案 1 :(得分:1)

你已经将Ans设置为等于print而不是它应该是的值。你的for循环也是每个字符而不是每个字。

更正后的代码:

from tkinter import *

class DM_3_1:

    def __init__(self):
        root = Tk()
        root.geometry('250x150')
        root.title("DiscreteMaths_3_1")
        usertext = StringVar()

        Label_1 = Label(root, text="Input")
        Label_2 = Label(root, text="Output")
        inputField = Entry(root, textvariable = usertext)
        outputField = Entry(root)

        inputField.bind('<Return>', lambda _: printLine())

        def printLine():
            counter = {}
            words=inputField.get().split()
            for word in words:
                counter[word] = counter.get(word, 0) + 1
                Ans = counter[word] - 1
                print(Ans, end=" ")
                outputField.insert(END, str(Ans))

        Label_1.grid(row = 0)
        Label_2.grid(row = 1)

        inputField.grid(row = 0, column = 1)
        outputField.grid(row = 1, column = 1)

        root.mainloop()

DM_3_1()

编辑:

由于Mike-SMT指出它更容易使用.split

编辑

代码以使用.split