Tkinter首个输入框无法使用、第二个输入框与文件夹选择控件对齐异常
问题背景
现有Tkinter代码运行时存在两个异常:
FolderSelect类内部定义的路径输入框无法正常工作- 类外单独定义的第二个输入框无法和文件夹选择控件对齐
需求是仅保留一个可用的输入框,用于后续处理用户输入的内容项。
原始代码如下:
import tkinter as tk from tkinter import * from tkinter import ttk from tkinter import filedialog, simpledialog from tkinter.messagebox import showinfo gui = Tk() gui.geometry("400x200") gui.title("Test") status = Label(gui, text="", relief=FLAT) status.grid(row=6, column=0, columnspan=3, sticky=W+E) frame = Frame(gui) class FolderSelect(Frame): def __init__(self,parent=None,folderDescription="",**kw): Frame.__init__(self,master=parent,**kw) self.folderPath = StringVar() self.lblName = Label(self, text=folderDescription) self.lblName.grid(row=0,column=0) self.entPath = Entry(self, textvariable=self.folderPath) self.entPath.grid(row=0,column=1) self.btnFind = ttk.Button(self, text="Browse Folder",command=self.setFolderPath) self.btnFind.grid(row=0,column=2) self.lblName2 = Label(self, text="Input") self.lblName2.grid(row=1,column=0) self.directory2Select = StringVar() self.entExt = Entry(self, textvariable=self.directory2Select) self.entExt.grid(row=1,column=1) def setFolderPath(self): folder_selected = filedialog.askdirectory() self.folderPath.set(folder_selected) @property def folder_path(self): return self.folderPath.get() def popup_showinfo(): showinfo("Done") def doStuff(): Images1 = directory1Select.folder_path Images2 = directory2Select.get() status = Label(gui, text="The folder you selected is " + str(Images1), bd=1, relief=SUNKEN, anchor=W) status.grid(row=6, column=0, columnspan=3, sticky=W+E) status.update() print(str(Images2)) popup_showinfo() ############################################################## mp = str(Images2) def stringToList(string): listRes = list(string.split(",")) return listRes strA = mp print(stringToList(strA)) mp = stringToList(strA) mp = [x.strip(' ') for x in mp] for m in mp: print("1 " + m) ############################################################## folderPath = StringVar() directory1Select = FolderSelect(gui,"Source folder ") directory1Select.grid(row=0,column=0) tk.Label(gui, text="Input").grid(row=1, column = 0) directory2Select = StringVar() directory2Select = Entry(gui) directory2Select.grid(row=1, column=1) c = ttk.Button(gui, text="Start", command=doStuff) c.grid(row=4,column=0) frame.pack()
此前尝试调整grid布局参数、改用pack布局都没有解决对齐问题。
问题根因
- 控件重复定义:既在
FolderSelect类内部实现了输入标签、输入框,又在主窗口下重复写了一套输入控件,两套控件分属不同父容器,grid列宽独立计算,无法对齐 - 变量逻辑混乱:先给
directory2Select赋值StringVar对象,紧接着又赋值为Entry对象,类内的输入框没有对外取值接口,导致类内输入框无法被正常读取 - 存在冗余组件:定义了空的
frame组件并调用pack,会打乱grid布局的排布逻辑
修复后代码
import tkinter as tk from tkinter import * from tkinter import ttk from tkinter import filedialog from tkinter.messagebox import showinfo gui = Tk() gui.geometry("400x200") gui.title("Test") status = Label(gui, text="", relief=FLAT) status.grid(row=6, column=0, columnspan=3, sticky=W+E) class FolderSelect(Frame): def __init__(self,parent=None,folderDescription="",**kw): Frame.__init__(self,master=parent,**kw) # 文件夹选择行 self.folderPath = StringVar() self.lblName = Label(self, text=folderDescription) self.lblName.grid(row=0,column=0, sticky=W, padx=2, pady=4) self.entPath = Entry(self, textvariable=self.folderPath, width=30) self.entPath.grid(row=0,column=1, padx=2, pady=4) self.btnFind = ttk.Button(self, text="Browse Folder",command=self.setFolderPath) self.btnFind.grid(row=0,column=2, padx=2, pady=4) # 内容输入行 self.lblName2 = Label(self, text="Input") self.lblName2.grid(row=1,column=0, sticky=W, padx=2, pady=4) self.inputContent = StringVar() self.entExt = Entry(self, textvariable=self.inputContent, width=30) self.entExt.grid(row=1,column=1, padx=2, pady=4) def setFolderPath(self): folder_selected = filedialog.askdirectory() self.folderPath.set(folder_selected) @property def folder_path(self): return self.folderPath.get() @property def input_text(self): return self.inputContent.get() def popup_showinfo(): showinfo("Done") def doStuff(): Images1 = directory1Select.folder_path Images2 = directory1Select.input_text status.config(text="The folder you selected is " + str(Images1), bd=1, relief=SUNKEN, anchor=W) status.update() print(str(Images2)) popup_showinfo() # 处理输入内容 mp = str(Images2) def stringToList(string): listRes = list(string.split(",")) return listRes strA = mp print(stringToList(strA)) mp = stringToList(strA) mp = [x.strip(' ') for x in mp] for m in mp: print("1 " + m) directory1Select = FolderSelect(gui,"Source folder") directory1Select.grid(row=0,column=0, padx=5, pady=5) c = ttk.Button(gui, text="Start", command=doStuff) c.grid(row=4,column=0, pady=10) gui.mainloop()
修复点说明
- 移除类外重复定义的输入标签、输入框,将输入逻辑完全整合到
FolderSelect类内部,所有控件共用同一套grid网格体系,自动实现对齐 - 给输入框新增
input_text属性对外暴露取值接口,解决类内输入框无法读取的问题 - 统一设置组件的内外边距、输入框宽度,优化视觉对齐效果
- 删除无用的空
frame组件及对应的pack调用、冗余的导包,避免布局冲突 - 优化状态栏更新逻辑,不需要重复新建Label组件,直接修改原有状态栏的文本即可
- 补上缺失的主窗口消息循环
gui.mainloop(),保证窗口正常运行
内容的提问来源于stack exchange,提问作者Pythonless
相关产品推荐
相关产品推荐

