You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

额外优化点

  1. 移除scrape函数的self参数:该函数不是类方法,点击按钮时会因参数不匹配报错。
  2. 优化文件操作逻辑:统一使用with open管理文件句柄,避免重复打开/关闭文件,同时指定编码utf-8防止中文乱码。
  3. 简化循环:无需使用enumerate,直接遍历flsh列表即可。

内容的提问来源于stack exchange,提问作者Shonky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:41:11