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

Tkinter应用最后一列后出现额外空白的问题求助

Tkinter应用最后一列后出现额外空白的问题求助

大家好,我正在用Tkinter和CustomTkinter开发一个应用,遇到了一个布局上的小问题,想请教下各位。

需求是这样的:用户点击按钮后,每次会生成3个组件(两个文本框+一个复选框),按行排列,每行最多放5组,满了就自动换行。我已经算出了组件该放的位置,但奇怪的是,界面最后一列后面会多出一块空白,可第一列前面却没有这个问题,我实在搞不懂原因在哪。

先贴我的代码:

import tkinter as tk
import customtkinter
from tkinter import messagebox

root = tk.Tk()
root.minsize(1100, 650)
root.iconbitmap('textures/logo.ico')
root.title('Diceware')

global number_of_dicerolls
number_of_dicerolls = 0

# 给行0到15设置权重
i = 0
while i <= 15:
    root.grid_rowconfigure(i, weight=1, uniform='row')
    i += 1

# 给列0到9设置权重
i = 0
while i <= 9:
    root.grid_columnconfigure(i, weight=1, uniform='column')
    i += 1

def display_words():
    """
    用户点击"roll dice"按钮时调用,显示骰子结果和对应单词
    """
    global number_of_dicerolls
    if number_of_dicerolls < 35:
        column_to_be_placed_in = (number_of_dicerolls % 5) * 2
        number_of_dicerolls += 1

        diceroll_widget = customtkinter.CTkTextbox(root, height=1)
        diceroll_widget.insert('1.0', 'Hello, world!')
        diceroll_widget.grid(row=2 + 2 * ((number_of_dicerolls - 1) // 5),
                            column=column_to_be_placed_in,
                            pady=(5, 0), padx=10)

        word_widget = customtkinter.CTkTextbox(root, height=1)
        word_widget.insert('1.0', 'Goodbye, world!')
        word_widget.grid(row=3 + 2 * ((number_of_dicerolls - 1) // 5),
                        column=column_to_be_placed_in,
                        sticky='n', pady=(0, 5), padx=10)

        test_var = tk.IntVar()
        checkbox = customtkinter.CTkCheckBox(master=root,
                                            variable=test_var, text='',
                                            checkbox_width=20,
                                            checkbox_height=20, fg_color='gray',
                                            hover_color='white')
        checkbox.grid(row=3 + 2 * ((number_of_dicerolls - 1) // 5),  column=column_to_be_placed_in + 1,
                    sticky='w')
    else:
        answer = tk.messagebox.askquestion('Dice roll limit reached',
                                        'You have reached the maximum limit of 35 dice rolls. Do you want '
                                        'to clear the screen?', parent=root)
        if answer == 'yes':
            clear_window()

roll_dice_button = customtkinter.CTkButton(root, border_width=2, border_color='black', text='ROLL DICE',
                                        fg_color='blue', hover_color='gray',
                                        command=display_words)
roll_dice_button.grid(row=0, column=0, columnspan=10, pady=0, sticky='n')

root.mainloop()

我已经尝试过这些方法,但都没解决:

  • 给组件添加不同的sticky属性
  • 调整行列的weight值
  • 去掉行列的uniform属性
  • 把padx、pady、ipadx、ipady都设为0

调整这些参数时,组件的位置确实会变化(比如去掉复选框的sticky='w'后,它就不会靠左了),但最后一列后面的空白始终存在,有没有大佬能帮我分析下原因?

备注:内容来源于stack exchange,提问作者IceTheDev2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:50:27