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

求助:Kivy窗口缩放时如何用Python保持按钮相对位置

解决Kivy窗口缩放时按钮保持相对位置的问题

嘿,我看你现在用的是固定pos坐标摆放按钮,这就是窗口调整大小后按钮位置跑偏的核心原因!Kivy的FloatLayout其实自带了完美的解决方案——pos_hint属性,它能让控件基于父布局的比例定位,完全不用手动获取屏幕宽高,纯Python代码就能搞定。

核心思路:用相对位置替代固定坐标

pos_hint是一个字典,键可以是'x'、'y'、'center_x'、'center_y'、'right'、'top'这些,值是0到1之间的浮点数(代表相对于父布局的比例)。举个例子:

  • pos_hint={'x': 0.02, 'y': 0.05}:按钮左上角距离布局左边2%、底部5%的位置
  • pos_hint={'right': 0.98, 'y': 0.05}:按钮右上角距离布局右边2%、底部5%的位置

不管窗口怎么缩放,按钮都会自动保持这个相对位置,根本不用操心屏幕具体宽高!

修改后的完整代码

我把你的代码改成用pos_hint定位按钮,同时保留了你原来的相对大小(size_hint),还顺便优化了背景图的适配:

""" Python 3.6.4 Kivy 1.10.0 Combines various .py files and allows the game to run. """
__author__ = "RidiculousName"
__date__ = "Jan. 2018"
import sys
from kivy.app import App
from kivy.config import Config
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout

class MainMenu(FloatLayout):
    def __init__(self, **kwargs):
        super(MainMenu, self).__init__(**kwargs)
        # 用pos_hint设置相对位置,替代固定pos
        start_button = Button(
            pos_hint={'x': 0.0156, 'y': 0.0833},  # 对应原(25,75):25/1600≈0.0156,75/900≈0.0833
            background_normal="Images\\Start.png", 
            background_down="Images\\Start_Down.png", 
            size_hint=(.1, .1)
        )
        load_button = Button(
            pos_hint={'x': 0.1406, 'y': 0.0833},  # 225/1600≈0.1406
            background_normal="Images\\Load.png", 
            background_down="Images\\Load_Down.png", 
            size_hint=(.1, .1)
        )
        options_button = Button(
            pos_hint={'x': 0.2656, 'y': 0.0833},  # 425/1600≈0.2656
            background_normal="Images\\Options.png", 
            background_down="Images\\Options_Down.png", 
            size_hint=(.15, .1)
        )
        quit_button = Button(
            pos_hint={'right': 0.9844, 'y': 0.0833},  # 用right定位:按钮右边距离布局右边约1.56%,对应原位置的相对关系
            background_normal="Images\\Quit.png", 
            background_down="Images\\Quit_Down.png", 
            size_hint=(.1, .1)
        )
        quit_button.bind(on_press=sys.exit)
        # 让背景图适配窗口大小,避免黑边
        background = Image(source="Images\\Main_Menu.png", allow_stretch=True, keep_ratio=False)
        
        self.add_widget(background)
        self.add_widget(start_button)
        self.add_widget(load_button)
        self.add_widget(options_button)
        self.add_widget(quit_button)

class BanditKing(App):
    def build(self):
        self.title = "Bandit King"
        self.icon = "Window_Icon.png"
        return MainMenu()

def main():
    Config.set("graphics", "width", "1600")
    Config.set("graphics", "height", "900")
    Config.write()
    BanditKing().run()

if __name__ == "__main__":
    main()

额外说明

我给背景图加了allow_stretch=True和keep_ratio=False,这样背景图会跟着窗口缩放,不会出现黑边,整体体验更流畅。

这个方法之所以有效,是因为Kivy的布局系统会自动监听窗口大小变化,当窗口缩放时,FloatLayout会根据pos_hint里的比例重新计算每个控件的位置,完全不用你手动写监听事件或者获取屏幕参数,这就是Kivy布局系统的便捷之处呀!

内容的提问来源于stack exchange,提问作者LuminousNutria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:49:19