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

Tkinter开发求助:搜索按钮异常消失、输入框二次运行消失

问题原因分析
  1. Tkinter线程安全限制:Tkinter的所有GUI操作必须在主线程中执行,不支持多线程创建或更新控件。你用Thread单独调用各个控件创建方法,会导致Tkinter的渲染机制混乱,引发控件短暂显示后消失、重复运行时控件加载失败的异常。
  2. 控件层级错位:搜索标签、输入框、按钮直接绑定在主窗口,而非search_frame内部,会导致控件位置计算错误,出现按钮显示在框架下方的问题。
修复方案

移除所有创建GUI控件的线程,将控件创建逻辑全部放在主线程执行,同时把搜索相关的控件统一放入search_frame内部,确保层级正确。

修复后的完整代码

from tkinter import ttk
from tkinter import *
from tkinter import messagebox
from PIL import Image, ImageTk
from datetime import datetime
import os, sys, shutil
from tkcalendar import Calendar, DateEntry
from threading import Thread
import time as t


class WidgetsApp:
    def __init__(self, master):
        self.master = master
        self.master.geometry("1200x900+350+40")
        self.master.resizable(width=False, height=False)
        self.master.title("نظام أدارة تجمع العلماء")
        
        # 主线程直接调用所有控件创建方法,移除多线程
        self.add_frame_title()
        self.add_search_frame()
        self.add_entry_search()
        self.get_search()
        

    def add_frame_title(self):
        self.title_frame = Frame(
            self.master,
            width=1175,
            height=80,
            background="#E8E4FA",
        )
        self.title_frame.place(x=18, y=4)
        self.title_label = Label(
            self.title_frame,
            width=30,
            height=1,
            background="#E8E4FA",
            font=("Libre Baskerville, serif;", 26),
            text="أضافة عالم",
        )
        self.title_label.place(x=300, y=20)

    def add_search_frame(self):
        self.search_frame = Frame(
            self.master,
            width=1165,
            height=80,
            background="#d9ddf7",
            relief="solid",
            border=2,
        )
        self.search_frame.place(x=18, y=88)

        self.search_label = Label(
            self.search_frame,  # 修正:将标签放入搜索框架内
            background="#d9ddf7",
            text="أبحث عن أسم",
            font=("Bold Oblique", 18),
        )
        self.search_label.place(x=1060, y=13)

    def add_entry_search(self):
        self.search_person = Entry(
            self.search_frame,  # 修正:将输入框放入搜索框架内
            width=20,
            background="powder blue",
            font=("Bold Oblique", 18),
            relief=RIDGE,
            border=1,
        )
        self.search_person.place(x=200, y=13)

    def get_search(self):
        self.image_search = Image.open("images\\user-avatar.png")
        self.image_search = self.image_search.resize((35, 35))
        self.show_image_search = ImageTk.PhotoImage(self.image_search)
        self.button_search = Button(
            self.search_frame,  # 修正:将按钮放入搜索框架内
            width=90,
            height=30,
            text="أبحث",
            font=("Bold Oblique", 18),
            padx=20,
            relief=FLAT,
            bd=1,
            compound='left',
            image=self.show_image_search
        )
        self.button_search.place(x=40,y=6)

优化说明

  • 所有控件创建逻辑回归主线程,避免Tkinter渲染异常;
  • 搜索相关控件统一归属search_frame,解决位置错位问题,同时保证背景色匹配;
  • 保留self.show_image_search实例变量,避免图片被垃圾回收导致按钮图标消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:55:22