首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Kivy:在弹出执行命令中绑定命令

Python Kivy:在弹出执行命令中绑定命令
EN

Stack Overflow用户
提问于 2018-07-27 22:58:12
回答 1查看 387关注 0票数 0

我想有一个弹出式窗口来确认用户确实想退出应用程序。现在,当我尝试将命令绑定到这两个按钮时,我只能直接在函数中添加dismiss,而不能通过回调。这可能是可以的。但我只能通过回调调用关闭例程,而不能在函数内部调用。当我在这个函数中绑定quit_app()时,它会在打开弹出窗口时直接执行。为什么?它应该只是绑定,而不是执行。

代码语言:javascript
复制
(Old script deleted.)

我已经更新了我的脚本,并包括了一个最小的kv文件。它基本上可以工作(和以前一样),但看起来有点奇怪。

UI-Test.py:

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
# Kivy imports:
import kivy
from kivy.app import App
from kivy.uix import popup
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.uix.tabbedpanel import TabbedPanel


VersionString = "DRAFT"
AppName = 'UI-Test'

def CloseProgram(Message, Level):
     print('Closing, level {} ({})'.format(Level, Message))
     sys.exit()

def OnClosing(self):
    print('Closing...')
    # ToDo: call popup


def init():
    print('Starting {} Version {}.'.format(AppName, VersionString))
    print('You are using Python version: {}'.format(sys.version))


class TestApp(App):
    title = AppName + ' ' + VersionString

    def on_pause(self):
        return True

    def quit_app(self,btn):
        CloseProgram('Normal Closing', 'Debug')


    class Pop(BoxLayout):

        def __init__(self, **kwargs):
            super(Pop, self).__init__(**kwargs)
            self.up()

        def callback(instance):
            if instance.id == 'quit':
                TestApp.quit_app(TestApp, 1)

        def up(self):
            print('popup')
            qbutton = Button(text='Quit', id='quit')
            abutton = Button(text='Return to Program', id='return')
            blayout = BoxLayout()
            blayout.add_widget(qbutton)
            blayout.add_widget(abutton)
            self.popup = kivy.uix.popup.Popup(title='Quit Program?', content=blayout, size_hint=(None, None), size=(400, 400))
            abutton.bind(on_release=self.popup.dismiss)
            qbutton.bind(on_release=TestApp.Pop.callback)
            self.popup.open()


if __name__ == '__main__':
    init()
    TestApp().run()

Test.kv:

代码语言:javascript
复制
#:kivy 1.9

<Button>:
    font_size: 15

# Main Layout:
BoxLayout:
    orientation: 'vertical'

    Button:
        text: "Quit"
        id: "quit_button"
        size_hint: (0.1, None)
        size: (150, 50)
        on_release: app.Pop.up(self)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-27 23:33:43

问题

如何从kv文件调用此弹出窗口?在我的版本中(参见更新的脚本),Pop不是TestApp的一部分,我无法从kv文件访问它

解决方案-使用kv文件

kv文件

使用Factory.Pop().open()打开

  1. Add import语句、Factory.Pop().open()
  2. 规则、<Pop>:和add class Pop()实例化

Factory object

工厂可用于自动注册任何类或模块,并在项目中的任何位置从它实例化类。

Python代码

  1. 使用App.get_running_app()获取class TestApp()

的实例

示例-使用kv文件

main.py

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

# Kivy imports:
import kivy
kivy.require('1.11.0')

from kivy.app import App
from kivy.uix.popup import Popup


VersionString = "DRAFT"
AppName = 'UI-Test'


def CloseProgram(Message, Level):
     print('Closing, level {} ({})'.format(Level, Message))
     sys.exit()


def OnClosing(self):
    print('Closing...')
    # ToDo: call popup


def init():
    print('Starting {} Version {}.'.format(AppName, VersionString))
    print('You are using Python version: {}'.format(sys.version))


class Pop(Popup):

    def callback(self, instance):
        App.get_running_app().quit_app(instance)


class TestApp(App):
    title = AppName + ' ' + VersionString

    def on_pause(self):
        return True

    def quit_app(self, btn):
        CloseProgram('Normal Closing', 'Debug')


if __name__ == '__main__':
    init()
    TestApp().run()

test.kv

代码语言:javascript
复制
#:kivy 1.11.0
#:import Factory kivy.factory.Factory

<Pop>:
    title: 'Quit Program?'
    size_hint: None, None
    size: 400, 400

    BoxLayout:
        Button:
            text: 'Quit'
            on_release:
                root.dismiss()
                root.callback(self)
        Button:
            text: 'Return to Program'
            on_release: root.dismiss()


<Button>:
    font_size: 15

# Main Layout:
BoxLayout:
    orientation: 'vertical'

    Button:
        text: "Quit"
        id: "quit_button"
        size_hint: (0.1, None)
        size: (150, 50)
        on_release: Factory.Pop().open()

输出-使用kv文件

解决方案-无kv文件

在调用Popup.open()

  • Use App.get_running_app()以获取类aempAPP

的实例之前,

  1. 绑定所有按钮

代码段

代码语言:javascript
复制
    def callback(self, instance):
        print("\ncallback:")
        self.popup.dismiss()
        App.get_running_app().quit_app(1)

    def up(self):
        ...
        self.popup = Popup(title='Quit Program?', content=blayout, size_hint=(None, None), size=(400, 400))
        abutton.bind(on_release=self.popup.dismiss)
        qbutton.bind(on_release=self.callback)
        self.popup.open()

...
class aempApp(App):
    ...
    def quit_app(self, value):
        print(value)

示例-没有kv文件

main.py

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.button import Button


class Pop(BoxLayout):

    def __init__(self, **kwargs):
        super(Pop, self).__init__(**kwargs)
        self.up()

    def callback(self, instance):
        print("\ncallback:")
        self.popup.dismiss()
        App.get_running_app().quit_app(1)

    def up(self):
        print('popup')
        qbutton = Button(text='Quit', id='quit')
        abutton = Button(text='Return to Program', id='return')
        blayout = BoxLayout()
        blayout.add_widget(qbutton)
        blayout.add_widget(abutton)
        self.popup = Popup(title='Quit Program?', content=blayout, size_hint=(None, None), size=(400, 400))
        abutton.bind(on_release=self.popup.dismiss)
        qbutton.bind(on_release=self.callback)
        self.popup.open()


class TestApp(App):

    def build(self):
        return Pop()

    def quit_app(self, value):
        print("value=", value)


if __name__ == "__main__":
    TestApp().run()

输出-无kv文件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51560637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档