Python Tkinter Canvas混用单选按钮与输入框布局重叠问题求解
解决方案
布局混乱的核心原因是同时混用了pack、place、canvas三种布局逻辑,没有统一的容器层级管理,控件渲染顺序和位置没有对齐。统一使用pack布局按期望的展示顺序排列控件即可解决问题,修改后的可运行代码如下:
from tkinter import * from tkinter import simpledialog from tkinter import messagebox import tkinter as tk import sys # 补全默认参数定义 parameter1 = 100000 parameter2 = 3 parameter3 = 5 parameter4 = 10 parameter5 = 2 parameter6 = 100 global answer global user_list # 准备参数字段 fields = ['最低参数1', '最低参数2', '最低参数3', '最低参数4','最低参数5', '最高参数6'] default_values = [parameter1,parameter2,parameter3,parameter4, parameter5,parameter6] captured_values = [] def on_closing(): if messagebox.askokcancel("退出", "确定要退出程序吗?"): root.destroy() # 以下为Jupyter环境专属输出重定向代码,普通Python环境可删除 # sys.stdout = orig_stdout # f.close() sys.exit("用户手动关闭了应用") def makeform(root, fields,default_values): entries = {} for i in range(len(fields)): row = tk.Frame(root) lab = tk.Label(row, width=24, text=fields[i]+": ", anchor='w') ent = tk.Entry(row) ent.insert(0, default_values[i]) row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5) lab.pack(side=tk.LEFT) ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X) entries[fields[i]] = ent return entries # 按钮点击事件 def btn_click (e): global answer answer_choice = rdo_var.get() answer = rdo_txt[answer_choice] global user_list user_list = entry1.get() captured_values.append(e['最低参数1'].get()) captured_values.append(e['最低参数2'].get()) captured_values.append(e['最低参数3'].get()) captured_values.append(e['最低参数4'].get()) captured_values.append(e['最低参数5'].get()) captured_values.append(e['最高参数6'].get()) root.destroy() return answer # 生成主窗口 root = tk.Tk() # 调整窗口尺寸适配所有控件 root.geometry ('320x420') root.title ('参数输入') # 单选按钮组,放在最顶部 rdo_txt = ['自动','手动'] rdo_var = tk.IntVar () rdo_frame = tk.Frame(root) rdo_frame.pack(side=tk.TOP, fill=tk.X, padx=5, pady=10) for i in range (len (rdo_txt)): rdo = Radiobutton (rdo_frame, value = i, variable = rdo_var, text = rdo_txt [i]) rdo.pack(side=tk.LEFT, padx=20) # 股票代码输入框,跟在单选按钮下方 stock_frame = tk.Frame(root) stock_frame.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5) stock_lab = tk.Label(stock_frame, width=12, text="股票代码:", anchor='w') entry1 = tk.Entry (stock_frame) stock_lab.pack(side=tk.LEFT) entry1.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X, padx=5) # 参数输入表单,跟在股票输入框下方 ents = makeform(root, fields, default_values) # 确认按钮放在最底部 confirm_button = tk.Button (root, text = '确认', command = (lambda e=ents: btn_click(e))) confirm_button.pack(side=tk.BOTTOM, pady=10) root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop () if(answer == '手动'): print('选择了手动运行模式') manual_run = 1 temp_user_list = [] user_list = user_list.split(',') for i in range(len(user_list)): temp_user_list.append(user_list[i].strip().upper()) print('输入的股票代码:' + str(temp_user_list)) else: manual_run = 0 print('选择了自动运行模式') # 读取修改后的参数 parameter1 = float(captured_values[0]) parameter2 = float(captured_values[1])
主要修改点
- 移除了冗余的canvas容器和place绝对定位,全部控件统一使用pack布局按顺序排列
- 新增了分组容器管理不同功能模块,避免控件错位
- 补全了原代码缺失的依赖导入、未定义参数,解决运行报错问题
- 调整了窗口尺寸,适配所有控件展示
- 所有界面文本翻译成中文,符合中文使用习惯
内容的提问来源于stack exchange,提问作者user3782604
相关产品推荐
相关产品推荐

