当打开程序时屏幕分辨率发生变化时,如何确定Kivy布局的位置?

时间:2019-07-19 14:35:46

标签: python kivy

我已经用Kivy构建了一个用户界面,该用户界面在程序启动时会正确显示,但是如果我插入新的监视器(或拖动到扩展监视器),则所有内容都会在窗口下消失,但是我可以看到部分内容当我最大化窗口时工作。如何将程序定位到窗口的开头?

我试图每秒将主布局的顶部值与窗口顶部的值进行匹配,并且试图每秒钟重置主布局的位置。

我的奇异果文件

auto byCount = [counts](const int& a, const int& b) { return counts.at(a) > counts.at(b); };

我试图修复它

#:import inch kivy.metrics.inch

<Questionaire>:
    #column_gl: ColumnGL
    outer_column_gl: OuterColumnGL
    cols: 2

    GridLayout:
        id: OuterColumnGL
        cols: 1
        size_hint_x: None
        width: inch(2)
        GridLayout:
            id: ColumnGL
            cols: 2
            size_hint_y: .9
            Button:
                size_hint_x: None
                width: inch(.1)
            Button:
                text: 'stuff'
        Button:
            size_hint_y: .1
            text: 'more stuff'

这是我第一次打开程序时出现的内容。 This is what comes up when I first open the program.

这就是我将窗口拖动到扩展监视器时出现的一切(所有内容似乎都消失了)。 This is what comes up as soon as I drag my window to an extended monitor (Everything appears to have disappeared).

这是我在扩展监视器上最大化的窗口(y位置错误)。 Here is my maximized window on the extended monitor (The y position is wrong).

1 个答案:

答案 0 :(得分:0)

使用size_hint_x或size_hint_x允许您设置窗口小部件相对于其父窗口小部件的大小。使用''pos_hint:{'x':val,'y':val}''会将窗口小部件的位置设置为其父窗口小部件。由于size_hint和pos_hint都相对于其父窗口小部件,因此x和y的值在0-1的范围内。

我建议您为按钮使用size_hint_x:0-1而不是宽度,这样它们将自动适应变化的分辨率。我将提供一个样本来帮助您。

无论使用生成器还是.kv文件,尺寸和位置最好以kv语言完成。添加的类和函数不需要具有反应性小部件。让我知道您是否需要更多说明或对奇异果有任何其他疑问。

同样,如果您希望它们自动缩放,我会在您的窗口小部件之后推荐这样做:

size_hint_x: 0.00-1.00
size_hint_y: 0.00-1.00
pos_hint: {'x': 0.00-1.00, 'y': 0.00-1.00}

一个应该向您展示其工作方式的示例,尽管我怀疑您需要所有额外的导入,因为这是为了在更改分辨率时保持一致性:

from kivy.app import App
from kivy.lang import Builder
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen
Config.set('input', 'mouse', 'mouse,multitouch_on_demand') #Prevent red dots from populating the screen with right clicks
Config.set('graphics','resizable',0) #Self-explanatory, prevents you from resizing the window
Config.write() #Writes the Config settings for the application

Builder.load_string("""
<One>:
    GridLayout:
        cols: 2
        size_hint_x: .5
        pos_hint: {'x': 0, 'y': 0}
        GridLayout:
            id: OuterColumnGL
            cols: 1
            size_hint_x: .2
            GridLayout:
                id: ColumnGL
                cols: 2
                size_hint_y: .9
                Button:
                    size_hint_x: .3
                Button:
                    text: 'stuff'
            Button:
                size_hint_y: .1
                text: 'more stuff'
    Button:
        text: 'Change Res'
        size_hint_x:.2
        size_hint_y: .2
        pos_hint: {'x': .75, 'y': .05}
        on_release: root.enlarge()
<Two>:
    GridLayout:
        cols: 2
        size_hint_x: .5
        pos_hint: {'x': 0, 'y': 0}
        GridLayout:
            id: OuterColumnGL
            cols: 1
            size_hint_x: .2
            GridLayout:
                id: ColumnGL
                cols: 2
                size_hint_y: .9
                Button:
                    size_hint_x: .3
                Button:
                    text: 'stuff'
            Button:
                size_hint_y: .1
                text: 'more stuff'
    Button:
        text: 'Change Res'
        size_hint_x:.2
        size_hint_y: .2
        pos_hint: {'x': .75, 'y': .05}
        on_release: root.shrink()
""")

class One(Screen):
    def enlarge(self):
        Window.size = (500, 600)
        sm.current = 'two'
class Two(Screen):
    def shrink(self):
        Window.size = (300, 400)
        sm.current = 'one'
sm = ScreenManager()
sm.add_widget(One(name='one'))
sm.add_widget(Two(name='two'))

class SampleApp(App):
    def build(self):
        Window.size = (300, 400)
        Window.left = 750
        Window.top = 40
        return sm

if __name__ == '__main__':
    SampleApp().run()