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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:18:01