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

How to print Python Output in Entry widget?

我在整个 Internet 上搜索了如何执行此操作,但没有任何结果。有一些类似的主题,当程序员询问如何将 'int' 数字解析为 Entry 输出时。但这要简单得多,因为您只需使用吸气剂,然后使用 insert() - 瞧。

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

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

就您所见,该应用程序可以运行,但有 'NoneNoneNone...'(取决于字符数,包括白色 spaces)而不是“0 0 1 1 0”。我该如何解决我的问题?逻辑错误在哪里?我猜是关于功能的,但我实际上并没有看到错误。

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

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

编写class时,您需要学习使用self.将标准变量转换为class属性。 Class 属性可以从 class 中的任何地方访问,包括 class 中的方法。使用常规变量可能会导致问题,因为它们在 __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()

您已将 Ans 设置为等于打印,而不是它应该是的值。此外,您的 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