Toplevel窗口无法pack组件的Python闪卡项目技术求助
解决Tkinter TopLevel窗口组件无法显示的问题
问题核心原因
你在review_button函数中创建的label2和entry2,父组件被错误指定为root(主窗口),而非新创建的TopLevel窗口tp。这些组件实际上被添加到了主窗口,但主窗口有固定的最大尺寸(700x100),被原有组件遮挡或超出显示范围,导致看起来像是没在TopLevel窗口中显示。
修复步骤
将label2和entry2的父组件改为tp:
# 原错误代码 label2 = Label(root, text = "Quizlet Link:") entry2 = Entry(root, textvariable = entry_text, width = 75) # 修改后 label2 = Label(tp, text = "Quizlet Link:") entry2 = Entry(tp, textvariable = entry_text, width = 75)
修正后的完整代码
import requests from html import unescape from bs4 import BeautifulSoup from tkinter import * import os def review_button(): tp = Toplevel() tp.title("Flashcard_Studio/Sets") tp.minsize(200,200) tp.maxsize(200,200) # 修正父组件为tp label2 = Label(tp, text = "Quizlet Link:") entry2 = Entry(tp, textvariable = entry_text, width = 75) label2.pack() entry2.pack() def scrape(): # 移除无用的self参数,避免点击按钮报错 print("Button pressed") HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" } soup = BeautifulSoup(requests.get(entry_text.get(), headers=HEADERS).text, "html.parser") flashcard_title = soup.find("h1").text # 优化文件操作:直接用with open追加,避免重复打开文件 with open(f'flashdata/{flashcard_title}.txt', 'w', encoding='utf-8') as f: flsh = soup.find_all("div", class_ = "SetPageTerms-term") flsh += soup.find_all("div", class_ = "SetPageTerms-term SetPageTerms-term--beyondSignupThreshold") for flashcards in flsh: # 简化循环,无需enumerate flash1 = flashcards.find("a", class_ = "SetPageTerm-wordText").text flash2 = flashcards.find("a", class_ = "SetPageTerm-definitionText").text f.write(f"w: {flash1}\n") f.write(f"def: {flash2}\n") print(f"w: {flash1}\n") print(f"def: {flash2}\n") # 读取文件验证 with open(f"flashdata/{flashcard_title}.txt", "r", encoding='utf-8') as x: print(x.read()) root = Tk() root.title("Flashcard_Studio/Scrape") root.minsize(700,100) root.maxsize(700,100) label = Label(text = "Quizlet Link:") entry_text = StringVar() entry = Entry(textvariable = entry_text, width = 75) button1 = Button(text = "Get Flashcards", command = scrape) button2 = Button(root, text = "Review Sets", command = review_button) label.pack() entry.pack() button1.pack() button2.pack() root.mainloop()
额外优化点
- 移除
scrape函数的self参数:该函数不是类方法,点击按钮时会因参数不匹配报错。 - 优化文件操作逻辑:统一使用
with open管理文件句柄,避免重复打开/关闭文件,同时指定编码utf-8防止中文乱码。 - 简化循环:无需使用
enumerate,直接遍历flsh列表即可。
内容的提问来源于stack exchange,提问作者Shonky
相关产品推荐
相关产品推荐

