Использование 2-х макетов страниц на KIVY в одном приложении и эмулятор для KIVY - PullRequest
0 голосов
/ 30 сентября 2018

Я сделал простое приложение Калькулятор, используя Kivy.Проблема, с которой я сталкиваюсь, заключается в том, что я могу использовать в приложении только один макет.Я могу использовать только макет сетки, в то время как мне нужно иметь макет страницы, а также макет сетки.Мне нужен слайдер, с помощью которого я могу прокручивать и видеть остальные кнопки в приложении вместо всех кнопок на одной странице. Более точно Код:

main.py

from __future__ import division
import kivy
from math import sqrt
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.config import Config
from kivy.uix.pagelayout import PageLayout
class CalcGridLayout(GridLayout):
    def something(x):
        x+="hi"
        return x
    # Function called when equals is pressed
    def calculate(self, calculation):
        if calculation:
            try:
                # Solve formula and display it in entry
                # which is pointed at by display
                self.display.text = str(eval(calculation))
            except Exception:
                self.display.text = "Galat Hai Bhai !"
class CalculatorApp(App):
    def build(self):
        return CalcGridLayout()
calcApp = CalculatorApp()
calcApp.run()
#buildozer init
#buildozer android debug deploy ---------------code to deploy into apk and then transfer the file into ur mobile

calculator.kv:

# Custom button
<CustButton@Button>:
    font_size: 65
    #color:.25,.80,.92,1
    size:100,100
    background_color:.50,.50,.50,1

# Define id so I can refer to the CalcGridLayout
# class functions
# Display points to the entry widget
<CalcGridLayout>:
    id: calculator
    display: entry
    rows: 8
    padding: 0
    spacing: 0

    # Where input is displayed
    BoxLayout:
        TextInput:
            id: entry
            font_size: 80
            multiline: False

    # When buttons are pressed update the entry
    BoxLayout:
        spacing: 0
        CustButton:
            text: "7"
            on_press: entry.text += self.text
        CustButton:
            text: "8"
            on_press: entry.text += self.text
        CustButton:
            text: "9"
            on_press: entry.text += self.text
        CustButton:
            text: "+"
            on_press: entry.text += self.text

    BoxLayout:
        spacing: 0
        CustButton:
            text: "4"
            on_press: entry.text += self.text
        CustButton:
            text: "5"
            on_press: entry.text += self.text
        CustButton:
            text: "6"
            on_press: entry.text += self.text
        CustButton:
            text: "-"
            on_press: entry.text += self.text

    BoxLayout:
        spacing: 0
        CustButton:
            text: "1"
            on_press: entry.text += self.text
        CustButton:
            text: "2"
            on_press: entry.text += self.text
        CustButton:
            text: "3"
            on_press: entry.text += self.text
        CustButton:
            text: "*"
            on_press: entry.text += self.text

    # When equals is pressed pass text in the entry
    # to the calculate function
    BoxLayout:
        spacing: 0
        CustButton:
            text: "AC"
            on_press: entry.text = ""
        CustButton:
            text: "0"
            on_press: entry.text += self.text
        CustButton:
            text: "="
            on_press: calculator.calculate(entry.text)
        CustButton:
            text: "/"
            on_press: entry.text += self.text
    #my new layout
    BoxLayout:
        spacing: 0
        CustButton:
            text: "Del"
            on_press: entry.text =entry.text[:-1] 
        CustButton:
            text: "Pow"
            on_press: entry.text += '**'
        CustButton:
            text: "//"
            on_press: entry.text +=self.text
        CustButton:
            text: "mod"
            on_press: entry.text +='%'
    BoxLayout:
        CustButton:
            text: "Made for learning face"

Теперь вывод этого приложения довольно прост: enter image description here

Здесь все числа и операции есть только наодна страницаЯ хочу другую страницу, которую я могу прокрутить, и она должна содержать такие операции, как '(', ')'.Я думал о реализации Page Layout для этого, но не смог реализовать оба макета (Grid + Page) в приложении.Может кто-нибудь, пожалуйста, помогите.Второе мое сомнение заключалось в том, что я могу одновременно проверить приложение на мобильном устройстве (эмулятор), я пытался использовать Kivy Remote Shell, но это не сработало.И каждый раз мне приходится использовать buildozer init, а затем развертывать, что само по себе занимает много времени.Затем передайте файл apk на мобильный через USB и протестируйте.Это отнимает много времени.

1 Ответ

0 голосов
/ 03 октября 2018

вы правы, желая использовать PageLayout, и это можно сделать, просто выполните следующие действия:

Шаг 1 : в вашем main.py добавьте эту строку:

from kivy.uix.pagelayout import PageLayout

Затем в вашем CalcGridLayout классе наследуют от PageLayout вместо GridLayout, например:

class CalcGridLayout(PageLayout):

Шаг 02 : в вашем калькуляторе.kv сразу после <CalcGridLayout>: добавьте следующее:

GridLayout:

, затем сделайте отступ для вашего кода по мере необходимости. Рабочий пример приведен ниже ... взято из вашего кода: main.py

from __future__ import division
import kivy
from math import sqrt
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.pagelayout import PageLayout
from kivy.config import Config
from kivy.uix.pagelayout import PageLayout

class CalcGridLayout(PageLayout):
    def something(x):
        x+="hi"
        return x
    # Function called when equals is pressed
    def calculate(self, calculation):
        if calculation:
            try:
                # Solve formula and display it in entry
                # which is pointed at by display
                self.display.text = str(eval(calculation))
            except Exception:
                self.display.text = "Galat Hai Bhai !"
class CalculatorApp(App):
    def build(self):
        return CalcGridLayout()
if __name__=='__main__':
    calcApp = CalculatorApp()
    calcApp.run()

и calculator.kv

# Custom button
<CustButton@Button>:
    font_size: 65
    #color:.25,.80,.92,1
    size:100,100
    background_color:.50,.50,.50,1

# Define id so I can refer to the CalcGridLayout
# class functions
# Display points to the entry widget
<CalcGridLayout>:
    GridLayout:
        id: calculator
        display: entry
        rows: 8
        padding: 0
        spacing: 0

        # Where input is displayed
        BoxLayout:
            TextInput:
                id: entry
                font_size: 80
                multiline: False

        # When buttons are pressed update the entry
        BoxLayout:
            spacing: 0
            CustButton:
                text: "7"
                on_press: entry.text += self.text
            CustButton:
                text: "8"
                on_press: entry.text += self.text
            CustButton:
                text: "9"
                on_press: entry.text += self.text
            CustButton:
                text: "+"
                on_press: entry.text += self.text

        BoxLayout:
            spacing: 0
            CustButton:
                text: "4"
                on_press: entry.text += self.text
            CustButton:
                text: "5"
                on_press: entry.text += self.text
            CustButton:
                text: "6"
                on_press: entry.text += self.text
            CustButton:
                text: "-"
                on_press: entry.text += self.text

        BoxLayout:
            spacing: 0
            CustButton:
                text: "1"
                on_press: entry.text += self.text
            CustButton:
                text: "2"
                on_press: entry.text += self.text
            CustButton:
                text: "3"
                on_press: entry.text += self.text
            CustButton:
                text: "*"
                on_press: entry.text += self.text

        # When equals is pressed pass text in the entry
        # to the calculate function
        BoxLayout:
            spacing: 0
            CustButton:
                text: "AC"
                on_press: entry.text = ""
            CustButton:
                text: "0"
                on_press: entry.text += self.text
            CustButton:
                text: "="
                on_press: calculator.calculate(entry.text)
            CustButton:
                text: "/"
                on_press: entry.text += self.text
        #my new layout
        BoxLayout:
            spacing: 0
            CustButton:
                text: "Del"
                on_press: entry.text =entry.text[:-1] 
            CustButton:
                text: "Pow"
                on_press: entry.text += '**'
            CustButton:
                text: "//"
                on_press: entry.text +=self.text
            CustButton:
                text: "mod"
                on_press: entry.text +='%'
        BoxLayout:
            CustButton:
                text: "Made for learning face"
    BoxLayout:
        id: test
        Button:
            text: 'You can then add more widgets here'

И наконец, в отношении эмулятора это не настоящий эмулятор в kivy, однако вы можете смоделировать устройство, настроив приложение для запуска на определенном устройстве.например, для запуска вашего приложения, имитирующего Motorola droid 2:

KIVY_DPI=240 KIVY_METRICS_DENSITY=1.5 python main.py --size 854x480

или HTC ONE X:

KIVY_DPI=320 KIVY_METRICS_DENSITY=2 python main.py --size 1280x720

или любое другое устройство:

KIVY_DPI=<your-desired-dpi> KIVY_METRICS_DENSITY=<your-device-density> python main.py --size <your-device-size>
...