Как я могу сделать Tkinter GUI, который автоматически заполняет определенные записи - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь создать GUI с помощью Tkinter, который позволяет вам вводить URL-адрес или идентификатор.

Пример URL: https://www.fanfiction.net/s/10030860/1/The-Final-Battle Пример ID: 10030860

Как видите, ID встроен в URL. Я хочу иметь две записи: одну для ввода URL-адреса, а другую - для ввода идентификатора. Если пользователь заполняет поле URL-адреса, идентификатор создается автоматически. (Если я помещу пример URL-адреса в поле ввода URL-адреса, я хочу, чтобы идентификатор примера в поле идентификатора был автоматически сгенерирован, и наоборот) Если пользователь заполняет поле идентификатора, URL-адрес создается автоматически.

Подробнее примеры: (Скобки претендуют на поля ввода)

URL: [https://www.fanfiction.net/s/10030860/1/The-Final-Battle] <-- If I fill this in
ID:  [10030860] <-- Python fills this in for me
URL: [https://www.fanfiction.net/s/10030860/1/The-Final-Battle] <-- Python fills this in for me
ID:  [10030860] <-- If I fill this in

Вот мой код:

import tkinter as tk
from tkinter import ttk

# Define a function to autofill in the URL and ID entries
def autofill_id_url():
    fanfic_url.set("https://www.fanfiction.net/s/" + fanfic_id.get() + "/1/")
    root.after(100, autofill_id_url)

# Root window
root = tk.Tk()

# Define the labeled frame where we input stuff
input_frame = tk.LabelFrame(master=root, text="Input")
input_frame.grid(row=0, column=0, padx=1, pady=1, rowspan=2, sticky=tk.NS)

# Label for entering URL
ttk.Label(master=input_frame, text="URL:").grid(row=0, column=0, padx=1, pady=1)
# Entry field for URL
fanfic_url = tk.StringVar()
url_entry = ttk.Entry(master=input_frame, textvariable=fanfic_url)
url_entry.grid(row=0, column=1, padx=1, pady=1)

# Label for entering ID
ttk.Label(master=input_frame, text="ID:").grid(row=1, column=0, padx=1, pady=1)
# Entry field for ID
fanfic_id = tk.StringVar()
id_entry = ttk.Entry(master=input_frame, textvariable=fanfic_id)
id_entry.grid(row=1, column=1, padx=1, pady=1)

# Start callback functions
autofill_id_url()

# Start GUI event loop
root.mainloop()

У меня есть часть, когда вы вводите идентификатор, URL-адрес создается автоматически. Но я не знаю не знаю как это сделать, когда вы заполняете поле URL, вы получаете заполненное поле идентификатора.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Вы можете использовать метод trace_variable из StringVar для автозаполнения. Следующий код сделает это, но это всего лишь базовый c код для начала работы, так как он потребует дополнительной работы для идеальной реализации автозаполнения.

after_ids = {}

def get_url(id_):
    """returns url from id."""
    url = 'https://www.fanfiction.net/s/{}/1/The-Final-Battle'
    return url.format(id_)

def get_id(url):
    """returns id from the url."""
    l = url.split('/')
    return l[4] if len(l) > 4 else ''

def autofill_entry(mode, dalay=1000):
    """Auto-fills Url/ID."""
    for v in after_ids.values():
        root.after_cancel(v)
    if mode == 'url':  
        id_ = get_id(fanfic_url.get())
        after_ids[0] = root.after(dalay, lambda: fanfic_id.set(id_))
    elif mode == 'id':
        url = get_url(fanfic_id.get())
        after_ids[1] = root.after(dalay, lambda: fanfic_url.set(url))

Теперь назначьте функцию autofill_entry в виджеты ввода StringVars.

fanfic_url.trace_variable('w', lambda *a: autofill_entry('url'))
fanfic_id.trace_variable('w', lambda *a: autofill_entry('id'))

Кроме того, я бы рекомендовал вам использовать from urllib.parse import urlparse, parse_qs для присоединения к URL-адресу и получения идентификатора из URL-адреса.

2 голосов
/ 18 июня 2020

Лучше выполнять автозаполнение при нажатии клавиши Enter в поле ввода вместо использования .after().

baseurl = 'https://www.fanfiction.net/s/'

def autofill_url_id(_):
    try:
        # extract the id from the url
        url = fanfic_url.get().strip()
        if url.startswith(baseurl):
            id = url.split('/')[4]
            fanfic_id.set(id)
    except IndexError:
        print('failed to extract id from the url')

def autofill_id_url(_):
    id = fanfic_id.get().strip()
    if id:
        fanfic_url.set(baseurl+id+'/1/')
...
# Start callback functions
#autofill_id_url()
url_entry.bind('<Return>', autofill_url_id)
id_entry.bind('<Return>', autofill_id_url)
...