tkinter在windows系统上的居中显示(一)

 最近闲来无事又开始研究tkinter,准备做一个系列来记录一下

import tkinter as tk

# 创建 Tkinter 窗口
root = tk.Tk()
# 宽度
width = 1000
# 高度
height = 600
# 获取屏幕宽度和高度
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight()
# 计算窗口显示时的左上角坐标
X = (screenWidth - width) / 2
Y = (screenHeight - height) / 2
size = '%dx%d+%d+%d' % (width, height, X, Y)
root.geometry(size)  # 设置窗口高、宽、左上角坐标

if __name__ == '__main__':
    # 窗口主循环
    root.mainloop()

 运行一下

 当然到这一步基本还是那个可以结束了。

但是对于吃毛求疵的我总感觉在有状态栏的情况下窗体整体偏下,原来是获取屏幕的宽、高是整个屏幕的宽、高。窗体在显示时应该时去除底部状态栏的。所以我对代码做了一点调整。

from ctypes import Structure, c_long, windll, byref
from tkinter import Tk


class RECT(Structure):
    _fields_ = [("left", c_long), ("top", c_long), ("right", c_long), ("bottom", c_long)]


SPI_GETWORKAREA = 48
# 创建 Tkinter 窗口
root = Tk()
# 宽度
width = 1000
# 高度
height = 600
# 获取屏幕工作区域的宽度和高度
'''居中显示'''
work_rect = RECT()
windll.user32.SystemParametersInfoW(SPI_GETWORKAREA, 0, byref(work_rect), 0)
ww = work_rect.right - work_rect.left
wh = work_rect.bottom - work_rect.top
size = '%dx%d+%d+%d' % (width, height, (ww - width) / 2, (wh - height) / 2)
root.geometry(size)

if __name__ == '__main__':
    # 窗口主循环
    root.mainloop()

看起来有什么感觉吗~~

接下来优化一下代码

from tkinter import Tk
from ctypes import Structure, c_long, windll, byref


class RECT(Structure):
    _fields_ = [("left", c_long), ("top", c_long), ("right", c_long), ("bottom", c_long)]


SPI_GETWORKAREA = 48


class WindowTk(Tk):
    def __init__(self, width=1000, height=600):
        super().__init__()
        '''居中显示'''
        work_rect = RECT()
        windll.user32.SystemParametersInfoW(SPI_GETWORKAREA, 0, byref(work_rect), 0)
        self.ww = work_rect.right - work_rect.left
        self.wh = work_rect.bottom - work_rect.top
        size = '%dx%d+%d+%d' % (width, height, (self.ww - width) / 2, (self.wh - height) / 2)
        self.geometry(size)


if __name__ == '__main__':
    root = WindowTk()
    root.mainloop()

<think>好的,用户想在不同编程语言或操作系统下实现终端输出内容居中显示。首先,我得理解终端文本居中的基本原理。终端通常是基于字符的,每个字符占据固定宽度,所以居中需要计算文本长度,然后添加适当的空格或填充。 首先,需要获取终端的宽度。不同操作系统可能有不同的方法。比如在Linux/macOS中,可以使用`tput cols`命令,而Windows可能要用到系统API或者第三方库。不过,用户提到不同编程语言,可能需要分别处理。 接下来,针对不同编程语言,我需要考虑如何实现。比如Python中,可以用`shutil.get_terminal_size()`获取终端宽度,计算左右空格。Bash脚本的话,可以用`tput`命令获取宽度,然后结合printf进行格式化。Java可能需要使用`System.getenv`获取环境变量,或者调用外部命令。Windows的批处理可能用`mode con`来获取宽度,但可能不太可靠,或者使用PowerShell的`$Host.UI.RawUI.WindowSize`。 另外,需要注意中文字符的问题,因为个中文字符可能占据两个英文字符的宽度,这会影响计算。如果用户需要处理多语言文本,可能需要特别处理字符宽度,比如使用Unicode字符的宽度计算库,但在简单情况下可能忽略这点,假设使用等宽字体。 然后,要提供具体的代码示例。比如Python的例子,先获取终端宽度,计算文本长度,然后左右填充空格。Bash中使用tput和printf。Java中可能用ANSI转义码,或者手动计算。Windows批处理可能比较麻烦,可能需要使用PowerShell。 还要考虑不同终端的兼容性,比如在tty终端中是否支持某些命令,或者图形界面终端的不同表现。比如引用[3]提到tty终端对中文支持不好,可能会影响显示,但居中本身可能不受影响,除非字符显示为问号,导致长度计算错误。 此外,用户可能希望了解如何在GUI中实现文本居中,但根据问题描述,用户明确提到终端输出,所以主要关注命令行环境。引用[4]提到PythonTkinter做UI界面,但这里不涉及,除非用户混淆了终端和图形界面,需要明确区分。 最后,需要验证示例代码的正确性,确保在不同环境下能运行。比如Python中使用shutil模块,可能需要处理异常,如果终端大小无法获取,可以设置默认值。Bash脚本中要确保tput可用,可能在旧系统中有差异。 总结步骤:获取终端宽度,计算填充空格,输出文本。针对不同语言和系统,实现方式不同,但核心逻辑致。需要提醒用户注意字符宽度的问题,特别是多字节字符,如中文,可能需要额外处理,否则居中不准确。</think>### 终端文本居中显示的实现方法 终端文本居中显示的核心思路是根据终端宽度计算文本两侧需要填充的空格数量,通过编程语言实现字符串格式化。以下分步骤说明具体实现方法: #### 1. 获取终端宽度 不同操作系统的实现方式: - **Linux/macOS**:使用`tput cols`命令获取列数 - **Windows**:通过系统API调用或使用`mode con`命令[^3] - **通用方法**:大多数编程语言提供库函数获取终端尺寸 $$终端宽度 = 文本宽度 + 左填充空格 + 右填充空格$$ #### 2. 计算填充空格 以Python为例的计算公式: ```python 填充空格数 = (终端宽度 - 文本实际长度) // 2 ``` #### 3. 具体语言实现示例 **(1) Python实现** ```python import shutil def print_center(text): term_width = shutil.get_terminal_size().columns print(text.center(term_width)) print_center("居中文本") ``` **(2) Bash脚本实现** ```bash text="居中文本" width=$(tput cols) printf "%*s\n" $(( (${#text} + width) / 2 )) "$text" ``` **(3) Java实现** ```java public class CenterText { public static void main(String[] args) { String text = "居中文本"; int width = Integer.parseInt(System.getenv("COLUMNS")); System.out.println(String.format("%" + (width/2 + text.length()/2) + "s", text)); } } ``` **(4) Windows批处理** ```batch @echo off setlocal enabledelayedexpansion for /F "tokens=2*" %%a in ('mode con ^| findstr /C:"列"') do set /a width=%%a set text=居中文本 set /a space=(width - 12)/2 echo %text% ``` #### 4. 注意事项 - 中文等宽字符需考虑字符实际显示宽度,建议使用`wcwidth`等库处理 - 图形界面终端与tty终端的宽度获取方式相同,但字体渲染可能影响实际显示效果[^2] - 在IDE内置终端中可能出现宽度获取异常,建议添加异常处理 $$数学表达示例:设终端宽度W,文本长度L,则填充量P=\frac{W-L}{2}$$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值