Я пытаюсь отобразить результат в GUI Python - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть рабочий текстовый редактор с GUI, который подсчитывает количество каждого слова в определенном .txt файле. У меня даже есть специальная кнопка для подсчета слов под названием «Анализ». Когда я щелкаю по нему, результат должен отображаться в новом окне, а не в cocnsole. Я знаю, что «print ()» показывает результат код в консоли. Но я не могу найти способ оспорить это в GUI. Когда я нажимаю кнопку «Анализ», окно должно появиться и показать результат. Я использую Python 3.8 в PyCharm Community Edition 2019.3.2

import string
import tkinter as tk
from tkinter import Tk, scrolledtext, Menu, filedialog, END, messagebox, simpledialog
import tkinter.scrolledtext as ScrolledText
from tkinter import *

root = Tk (className = " Text Editor")
textArea = ScrolledText.ScrolledText(root, width = 100, height = 50)
textArea.pack()

def newFile():
    if len(textArea.get('1.0', END+'-1c')) > 0:
        if messagebox.askyesno("Save", "Would you like to save?"):
            saveFile()
        else:
            textArea.delete('1.0', END)
    root.title("TEXT EDITOR")
def OpenFile():
    file = filedialog.askopenfile(parent = root, title = 'Select a text file', filetypes = (("Text file", ".txt"),("All files", "*.*")))
    if file != None:
        contents = file.read()
        textArea.insert('1.0', contents)
        file.close()

def saveFile():
    file = filedialog.asksaveasfile(mode='w')

    if file!= None:
        data = textArea.get('1.0', END+'-1c')
        file.write(data)
        file.close()
def exit():
    if messagebox.askyesno("Quit", "Are you sure you want to quit?"):
        root.destroy()
def about():
    label = messagebox.showinfo("About", "A simple text editor 0.1")

Проблема с вышеуказанной функцией. Я хочу, чтобы результаты отображались во внешнем окне.

def AnalyzeData():
    text = open("dest.txt", "r")


    d = dict()

    for line in text:
        line = line.strip()

        line = line.lower()

        line = line.translate(line.maketrans("", "", string.punctuation))

        words = line.split(" ")


        for word in words:
            if word in d:
                d[word] = d[word] + 1
            else:
                d[word] = 1

    for key in list(d.keys()):
        print(key, ":", d[key])

.

menu = Menu(root)
root.config(menu=menu)
FMenu = Menu(menu)
menu.add_cascade(label = "File", menu = FMenu)
FMenu.add_command(label = "New", command = newFile)
FMenu.add_command(label = "Open", command = OpenFile)
FMenu.add_command(label = "Save", command = saveFile)
FMenu.add_separator()
FMenu.add_command(label = "Exit", command = exit)

helpMenu = Menu(menu)
menu.add_cascade(label = "Help")
menu.add_cascade(label = "Analyze", command = AnalyzeData)
menu.add_cascade(label = "Create Plot")
menu.add_cascade(label = "About", command = about)

textArea.pack()

root.mainloop()

1 Ответ

0 голосов
/ 07 февраля 2020

Самый простой способ - использовать messagebox.showinfo():

messagebox.showinfo('Analyze Data', '\n'.join(key+':'+str(val) for key, val in d.items()))

для замены кода:

for key in list(d.keys()):
    print(key, ":", d[key])

Но окно сообщения может быть очень длинным, что не помещается на экране высота.

Так что лучше использовать Text виджет в Toplevel окне:

win = tk.Toplevel(root)
win.geometry('+%s+%s' % (root.winfo_x()+100, root.winfo_y()+50))
win.transient(root)
result = tk.Text(win, width=40, height=20)
result.pack()
for key in sorted(d.keys()):
    result.insert('end', '%s: %s\n' % (key, d[key]))
win.grab_set()
...