求助: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
相关产品推荐
相关产品推荐

