Reputation: 39
I'm trying to use messagebox to display the output of my function however while the function displays in the terminal it doesn't display in the messagebox. Is messagebox the correct one or is there another function I should be using? I simply want the x words to display on the GUI.
#Imports
import tkinter as tk
from tkinter import *
from tkinter import filedialog
from collections import Counter
from tkinter import messagebox
import collections
# Initialize the dictionary
wordcount = {}
#open Macbeth text file
file = open('Macbeth Entire Play.txt', encoding="utf8")
a= file.read()
class Application(tk.Frame):
def __init__(self, master):
super().__init__() # Call __init__() method in parent (tk.Frame)
self.label = tk.Button(self, text='How many words to Sort?', command=self.ask_count)
self.label.grid(row=0)
self.open_btn = tk.Button(text='Compute', command=self.ask_count)
self.open_btn.pack(pady=(30,10))
self.exit_btn = tk.Button(text='Exit', command=master.destroy)
self.exit_btn.pack()
def ask_count(self):
with open('Macbeth Entire Play.txt', encoding="utf8") as file:
self.file_text = file.read()
for word in a.lower().split():
word = word.replace(".","")
word = word.replace(",","")
word = word.replace(":","")
word = word.replace("\"","")
word = word.replace("!","")
word = word.replace("“","")
word = word.replace("‘","")
word = word.replace("*","")
if word not in wordcount:
wordcount[word] = 1
else:
wordcount[word] += 1
n_print = int(input("How many most common words are: "))
print("\nThe {} most common words are as follows\n".format(n_print))
word_counter = collections.Counter(wordcount)
for word, count in word_counter.most_common(n_print):
print(word, ": ", count)
messagebox.showinfo("The top words are: " == n_print)
# Close the file
file.close()
messagebox.showinfo("The top words are: ")
if __name__ == '__main__':
root = tk.Tk()
root.title("Count words")
root.geometry('400x400+900+50')
app = Application(root)
app.pack(expand=True, fill='both')
root.mainloop()
Upvotes: 0
Views: 124
Reputation: 958
It seems that the line self.label(text='How many words to Sort?', command=self.ask_count).grid(row=0)
is causing the error.
In this line, it seems that you are trying to call the label()
function from self
, but there is no label
method in class Application(tk.Frame)
. Also, Tkinter labels don't have a command
argument, so you'll have to use a button instead. It is also a good idea to store the button in a variable and call grid()
on a separate line. This allows you to keep a reference to the button object.
Try replacing that line with this:
self.label = tk.Button(self, text='How many words to Sort?', command=self.ask_count)
self.label.grid(row=0)
This will create a button and put it inside the application, which is what it seems you are trying to do.
EDIT: It looks like the original question has been modified. To answer the new question, replace the line
messagebox.showinfo("The top words are: " == n_print)
with the following:top_words = [(str(word)+": "+str(count)) for word, count in word_counter.most_common(n_print)] messagebox.showinfo("Top words...", "The top words are: \n" + "\n".join(top_words))
Upvotes: 3
Reputation: 7680
You wrote this:
class Application(tk.Frame):
def __init__(self, master):
super().__init__() # Call __init__() method in parent (tk.Frame)
self.label(text='How many words to Sort?', command=self.ask_count).grid(row=0)
which doesn't make sense as self.label
isn't defined. My guess is that you wanted to write
class Application(tk.Frame):
def __init__(self, master):
super().__init__() # Call __init__() method in parent (tk.Frame)
self.label = tk.Button(text='How many words to Sort?', command=self.ask_count)
self.label.grid(row=0)
Upvotes: 1