我无法从用户输入中获取多行并将其显示回他们。我正在使用 OOP 制作一个窗口让用户输入他们的论文,并显示一个窗口。 当我使用.get()
时,没有任何内容出现。有什么建议吗?
import tkinter
from tkinter import *
class userInterface:
def __init__(self):
pass
def uploadWindow(self):
#Generic window that is used for each new window
self.essayAdd = tkinter.Tk()
self.essayAdd.geometry("1500x900")
self.essayAdd.title("Text Analysis")
self.essayAdd.mainloop
def copyPasteCommand(self):
#Creates a new window with space to copy and paste text
self.uploadWindow()
#Title of window
tkinter.Label(self.essayAdd, text = "Uploading your essay", fg = "white", bg = "purple", font=("Helvetica", 20)).pack(fill = "x")
#Creating an input for user to paste their essay
tkinter.Label(self.essayAdd, text="Please paste your essay below.", font=("Helvetica", 16)).place(x = 50, y=40)
self.userEssayLabel = Text()
self.scrollBar = Scrollbar(self.essayAdd)
self.scrollBar.config(command=self.userEssayLabel.yview)
self.userEssayLabel.config(yscrollcommand=self.scrollBar.set)
self.scrollBar.pack(side=RIGHT, fill=Y)
self.userEssayLabel.pack(expand=YES, fill=BOTH)
self.userEssay = self.userEssayLabel.get("1.0", END)
#Creating buttons to quit and move on to next step
#Quit
self.quitting = tkinter.Button(self.essayAdd, text = "Quit", fg = "purple", font =("Helvetica", 16), command = self.essayAdd.destroy).place(x=50, y=600)
#Next step
self.enter = tkinter.Button(self.essayAdd, text = "Enter", fg = "purple", font =("Helvetica", 16), command = self.essayWindow).place(x=1235, y=600)
def essayWindow(self):
self.essayAdd.destroy()
self.uploadWindow()
tkinter.Label(self.essayAdd, text = "Essay Analysis", fg = "white", bg = "purple", font=("Helvetica", 20)).pack(fill = "x")
tkinter.Label(self.essayAdd, text = self.userEssay, fg = "white", bg = "purple", font=("Helvetica", 16)).place(x=1235, y=600)
execute = userInterface()
execute.copyPasteCommand()
您在创建文本小部件后的几毫秒内调用self.userEssayLabel.get("1.0", END)
,远在用户有机会输入任何数据之前。
您需要等待调用get
方法,直到您实际需要小部件的内容,而不是之前。
您需要修复一些问题,并且会更改一些内容。
self.essayAdd.mainloop
在这里什么也没做。您需要在末尾添加()
,如下所示:self.essayAdd.mainloop()
.self.userEssay = self.userEssayLabel.get("1.0", END)
不是在你思考的时候发生的。这只会发生在运行代码的实例上,并且永远不会再次发生。所以它基本上有一个空字符串分配给self.userEssay
。我不会将
place()
用于按钮和标签。place()
原样有自己的位置,但在大多数情况下,您将希望将grid()
或pack()
用于大多数小部件放置。您过度使用
self.
.前缀self.
用于标识类属性,并且唯一需要成为类属性的情况是,如果它将从单独的方法访问,而不是在类外部的代码中创建或由它创建。当您只需要一个时,您同时使用
import tkinter
和from tkinter import *
。首选方法是import tkinter as tk
。然后,您只需在需要的任何地方使用tk
前缀即可。看到您正在使用一个类,我会从
Tk()
继承而不是self.essayAdd = tkinter.Tk()
.通过这种方式,我们可以更轻松地管理事情,并获得课堂上所需的所有功能。
这里所说的只是您的代码清理了一点。如果您有任何问题,请告诉我。
import tkinter as tk
class UserInterface(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('1500x900')
self.title('Text Analysis')
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.main_frame = tk.Frame(self)
self.main_frame.columnconfigure(0, weight=1)
self.main_frame.grid(row=1, column=0, columnspan=2, sticky='nsew')
tk.Label(self, text='Please paste your essay below.',
font=('Helvetica', 16)).grid(row=0, column=0, columnspan=2, sticky='ew')
tk.Label(self, text='Uploading your essay', fg='white', bg='purple',
font=('Helvetica', 20)).grid(row=2, column=0, columnspan=2, sticky='ew')
self.user_essay_label = tk.Text(self.main_frame)
scrollbar = tk.Scrollbar(self)
scrollbar.config(command=self.user_essay_label.yview)
self.user_essay_label.config(yscrollcommand=scrollbar.set)
scrollbar.grid(row=1, column=2)
self.user_essay_label.grid(row=0, column=0, sticky='nsew')
tk.Button(self, text='Quit', fg='purple', font=('Helvetica', 16),
command=self.destroy).grid(row=3, column=0)
tk.Button(self, text='Enter', fg='purple', font=('Helvetica', 16),
command=self.essay_window).grid(row=3, column=1)
def essay_window(self):
self.main_frame.destroy()
self.main_frame = tk.Frame(self)
self.main_frame.grid(row=1, column=0, columnspan=2, sticky='nsew')
tk.Label(self.main_frame, text='Essay Analysis', fg='white', bg='purple',
font=('Helvetica', 20)).pack(fill='x')
tk.Label(self.main_frame, text=self.user_essay_label.get('1.0', 'end'), fg='white', bg='purple',
font=('Helvetica', 16)).place(x=1235, y=600)
if __name__ == '__main__':
UserInterface().mainloop()