首页 > 解决方案 > 如何制作自动填充某些条目的 Tkinter GUI

问题描述

我正在尝试使用 Tkinter 制作一个允许您输入 URL 或 ID 的 GUI。

示例 URL:https ://www.fanfiction.net/s/10030860/1/The-Final-Battle 示例 ID:10030860

如您所见,ID 嵌入在 URL 中。我想要两个条目,一个用于输入 URL,一个用于输入 ID。如果用户填写 URL 框,则会自动生成 ID。(如果我将示例 URL 放在 URL 输入框中,我希望自动生成 ID 框中的示例 ID,反之亦然)如果用户填写 ID 框,则自动生成 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()

我有填写ID时的部分,URL是自动生成的。但是我不知道如何制作,当您填写 URL 框时,您会得到为您填写的 ID 框。

提前致谢。

标签: pythonuser-interfacetkinteruser-input

解决方案


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)

推荐阅读