Удалите лишнее диалоговое окно TK и поля объединения - PullRequest
0 голосов
/ 25 апреля 2020

Написание кода, который извлекает тексты песен с учетом имени исполнителя и песни, принимая пользовательский ввод каждой переменной. Затем он извлекает его с веб-сайта и отображает текст в новом диалоговом окне. Когда я запускаю этот код, я получаю дополнительное поле с заголовком «tk». Кроме того, я хотел бы знать, как объединить первые диалоговые окна, которые принимают вводимые пользователем данные исполнителя и песни.

from tkinter.simpledialog import SimpleDialog

import requests

import json

from tkinter import *
import tkinter as tk
import json
from tkinter import Tk, Button, Frame, Entry, END
from tkinter import *

from tkinter import simpledialog

application_window = tk.Tk()


artist = simpledialog.askstring("Artist", "What is the artist name?",
                                parent=application_window)

song = simpledialog.askstring("Song", "What is the song name?",
                                parent=application_window)

url = "https://api.lyrics.ovh/v1/" + artist + "/" + song

response = requests.get(url)
try:

    json_data = json.loads(response.content)
    lyrics = json_data["lyrics"]

except KeyError:
    print("")

class ABC(Frame):
    def __init__(self,parent=None):
        Frame.__init__(self,parent)
        self.parent = parent
        self.make_widgets()

    def make_widgets(self):

        self.winfo_toplevel().title(artist.capitalize() + "-" + song.capitalize())

        label = Entry(self)
        label.pack(side="top", fill="x")

try:
    root = Tk()
    abc = ABC(root)
    text = Text(root)
    text.insert(INSERT, lyrics)
    text.pack()

    root.mainloop()
except NameError:
    print("Invalid artist or song title")


1 Ответ

0 голосов
/ 25 апреля 2020

tk - это главное окно, которое создается автоматически (если вы не создаете его вручную), и вы должны использовать его для отображения своего результата или для запроса исполнителя, песни и более поздних версий для отображения текста песни.

Вы не можете комбинировать стандартные диалоги - вы должны создать собственный диалог, используя главное окно Tk или Toplevel окно (которое используется для создания второго и следующего окна - как диалоговое окно windows)

Это это моя версия Я попытался создать простой пример, но в конце концов я сделал что-то более сложное, но код внутри классов кажется чище и более читабельным.

Программа при запуске создает MainWindow (Tk) с Text для текста и автоматически открывает DialogWindow (Toplevel), чтобы запросить исполнителя и песню. После закрытия диалога он получает текст и вставляет Text в MainWindow.

Есть кнопка, чтобы снова открыть диалог для поиска нового исполнителя и песни.

import tkinter as tk
import tkinter.messagebox as msg
import requests

class DialogWindow(tk.Toplevel):

    def __init__(self, *args, **kwars):
        super().__init__(*args, **kwars)
        self.title('My Dialog')

        self.artist = ''
        self.song = ''

        self.create_widgets()

    def create_widgets(self):
        label = tk.Label(self, text="What is the artist name?")
        label.pack()

        self.entry_artist = tk.Entry(self)
        self.entry_artist.pack()

        label = tk.Label(self, text="What is the song name?")
        label.pack()

        self.entry_song = tk.Entry(self)
        self.entry_song.pack()

        button = tk.Button(self, text='OK', command=self.on_click)
        button.pack()

    def on_click(self):
        # get values from Entries because `destroy` (which will close window)
        # will remove widgets from memory and there will be no access to Entries

        self.artist = self.entry_artist.get()
        self.song = self.entry_song.get()

        self.destroy()


class MainWindow(tk.Tk):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.title('My Result')

        self.artist = ''
        self.song = ''
        self.lyrics = ''

        self.create_widgets()

        # open dialog 1 second after start
        self.after(1000, self.on_click)

        self.mainloop()

    def create_widgets(self):

        self.text = tk.Text(self)
        self.text.pack()

        button = tk.Button(self, text='Open Dialog', command=self.on_click)
        button.pack()

    def on_click(self):
        dialog = DialogWindow(self)
        self.wait_window(dialog) # wait for dialog close

        self.artist = dialog.artist
        self.song = dialog.song

        self.get_data()

    def set_title(self):
        self.title(self.artist.capitalize() + "-" + self.song.capitalize())

    def get_data(self):
        url = "https://api.lyrics.ovh/v1/{}/{}".format(self.artist, self.song)
        try:         
            response = requests.get(url)
            data = response.json()
        except Exception as ex:
            print('Exception:', ex)
            msg.showerror('Exception', ex)
            data = dict()

        if 'error' in data:
            print('Error:', data['error'])
            msg.showerror('Error', data['error'])
        else:
            if 'lyrics' in data:
                self.lyrics = data['lyrics']

                self.text.delete('1.0', 'end')
                self.text.insert('end', self.lyrics)

                self.set_title()
            else:
                msg.showerror('Error', "No Lyrics")



if __name__ == '__main__':
    MainWindow()

enter image description here

...