Отображение нескольких строк пользовательского ввода в tkinter с текстовым виджетом - PullRequest
0 голосов
/ 03 февраля 2020

У меня проблемы с получением нескольких строк из пользовательского ввода и отображением их обратно. Я использую 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()

Ответы [ 2 ]

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

Есть несколько вещей, которые нужно исправить, и несколько вещей, которые я бы изменил.

  1. self.essayAdd.mainloop здесь ничего не делает. Вам нужно добавить () в конце так: self.essayAdd.mainloop().

  2. self.userEssay = self.userEssayLabel.get("1.0", END) не происходит, когда вы думаете. Это происходит только в том случае, если ваш код запускается и никогда больше. Так что в основном это пустая строка, присвоенная self.userEssay.

  3. Я бы не использовал place() для кнопок и надписей. place() имеет свое место, но по большей части вы захотите использовать grid() или pack() для большинства мест размещения ваших виджетов.

  4. Вы злоупотребляете self.. Префикс self. используется для идентификации атрибутов класса, и единственное время, когда что-то должно быть атрибутом класса, - это когда к нему будет обращаться из отдельного метода, чем он был создан внутри или с помощью кода вне класса.

  5. Вы используете import tkinter и from tkinter import *, когда вам нужен только один. Предпочтительный метод import tkinter as tk. Затем вы просто используете префикс tk везде, где вам нужно.

  6. Видя, что вы используете класс, который я бы унаследовал от 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()
0 голосов
/ 03 февраля 2020

Вы звоните self.userEssayLabel.get("1.0", END) всего через несколько миллисекунд после создания текстового виджета, задолго до того, как пользователь сможет ввести какие-либо данные.

Вам нужно подождать, чтобы вызвать get метод, пока вам действительно не понадобится содержимое виджета, а не раньше.

...