Как изменить глобальную переменную с помощью кнопки - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю над программой, которая должна быть помощником для людей, которые ходят в мой местный спортзал.Хотя у меня проблемы с глобальной переменной difficult, чтобы изменить ее строковое значение.Я хочу иметь возможность нажать любую из кнопок в main_Screen и получить строку изменения difficult.Поэтому в классе BoulderingDirectory он может предварительно преобразовать соответствующий SQL для моей базы данных, содержащей упражнения.

Примечание: я обрезал большую часть кода, потому что в тренажерном зале есть несколько секций, и япросто сосредоточиться на этом разделе, потому что он точно так же применяется к другим разделам.

screen_manager = ScreenManager()

global difficult

difficult = "Beginner"

class ScreenManagerApp(App):
   def build(self):
       return screen_manager

class MyScreenManager(ScreenManager):
   pass

class main_Screen(Screen):
   pass

class urec_facilities(Screen):
   pass

class AdventureDirectory(Screen):
   pass


class BoulderingDirectory(Screen):
    connection = sqlite3.connect("workoutData.db")
    cursor = connection.cursor()

    if (difficult == "Beginner"):
        cursor.execute("SELECT * FROM workoutData WHERE Activity = 
                       'Bouldering' and Difficulty = 'Beginner'")
    elif(difficult == "Intermediate"):
        cursor.execute("SELECT * FROM workoutData WHERE Activity = 
                        'Bouldering' and Difficulty = 'Intermediate'")
    else:
        cursor.execute("SELECT * FROM workoutData WHERE Activity = 
                       'Bouldering' and Difficulty = 'Advanced'")

    rows = StringProperty(str(cursor.fetchall()))


root_widget = Builder.load_string("""


<main_Screen>:
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: "mainScreenImage.png"

Label:
    text: "Select your dificulty"
    font_size: 50
    color: (0.9,0.8,0,1)
    background_color: (0,0,0,0)
    pos_hint: {"x": 0, "y": 0.20}


Button:
    text: 'Beginner'
    font_size: 30
    size_hint: 0.2,0.2
    color: (0.9,0.8,0,1)
    background_color: (0,0,0,0)
    pos_hint: {"x": 0.16, "y": 0.1}
    on_release:
        #set the difficult variable to a string "Beginner"
        app.root.current = 'urecFac'



Button:
    text: 'Intermediate'
    font_size: 30
    size_hint: 0.2,0.2
    color: (0.9,0.8,0,1)
    background_color: (0,0,0,0)
    pos_hint: {"x": 0.41, "y": 0.1}
    on_release:
        #set the difficult variable to a string "Intermediate"
        app.root.current = 'urecFac'


Button:
    text: 'Advanced'
    font_size: 30
    size_hint: 0.2,0.2
    color: (0.9,0.8,0,1)
    background_color: (0,0,0,0)
    pos_hint: {"x": 0.66, "y": 0.1}
    on_release:
        #set the difficult variable to a string "Advanced"
        app.root.current = 'urecFac'

<urec_facilities>:
 BoxLayout:
    orientation: "vertical"
    Button:
        text: "Adventure Center"
        font_size: 50
        color: (0.9,0.8,0,1)
        background_normal: "adventureCenterImage.jpg"
        on_release: app.root.current = "AdventureDirectory"
    Button:
        background_normal: "mainScreenImage.png"
        text: "Back"
        font_size: 50
        color: (0.9,0.8,0,1)
        on_release: app.root.current = "mainScreen"

<AdventureDirectory>:
BoxLayout:
    orientation: "vertical"
    Button:
        text: "Bouldering"
        font_size: 50
        color: (0.9,0.8,0,1)
        on_release:
            app.root.current = "BoulderingDirectory"

    Button:
        text: "Go back"
        font_size: 50
        color: (0.9,0.8,0,1)
        on_release:
            app.root.current = "urecFac"

<BoulderingDirectory>:
BoxLayout:
    orientation: "vertical"
    Label:
        text: root.rows
        text_size: (root.width - 175), None
    Button:
        text: "Go back"
        font_size: 50
        color: (0.9,0.8,0,1)
        background_color: (0,0,0,1)
        on_release:
            app.root.current = "AdventureDirectory"

""")



screen_manager.add_widget(main_Screen(name = "mainScreen"))
screen_manager.add_widget(urec_facilities(name = "urecFac"))
screen_manager.add_widget(AdventureDirectory(name = "AdventureDirectory"))
screen_manager.add_widget(BoulderingDirectory(name = "BoulderingDirectory"))


ScreenManagerApp().run()

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Ключевое слово global позволяет создавать и изменять переменные в глобальной области, а не в локальной области.Синтаксис для этого global variableName.Так что просто добавьте global difficult в любое место, где вам нужно изменить и / или получить доступ к глобальной переменной.

Вы можете изменить начало вашего BoulderingDirectory класса следующим образом:

class BoulderingDirectory(Screen):
    global difficult

См. здесь для получения дополнительной информации о ключевом слове global.

0 голосов
/ 13 декабря 2018

Нет необходимости или целесообразно использовать глобальные переменные.В этом нет необходимости, поскольку изменение значения глобальной переменной не уведомляет об изменении копий и не рекомендуется, поскольку его трудно отладить (дополнительную информацию читайте Почему глобальные переменные являются злыми? ).

В этом случае решение заключается в использовании StringProperty, который можно подключить к обратному вызову для обновления данных.С другой стороны, вы должны реализовать логику запроса в методе, чтобы он мог вызываться несколько раз.Я реструктурировал ваш проект с учетом вышеизложенного, и решение состоит в следующем:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.properties import StringProperty
import sqlite3

class Main_Screen(Screen):
   difficult = StringProperty()

class Urec_facilities(Screen):
   pass

class AdventureDirectory(Screen):
   pass

class BoulderingDirectory(Screen):
    rows = StringProperty("")

    def load_from_difficult(self, difficult):
        connection = sqlite3.connect("workoutData.db")
        cursor = connection.cursor()
        cursor.execute("SELECT * FROM workoutData WHERE Activity = 'Bouldering' and Difficulty = ?", (difficult,))
        self.rows = str(cursor.fetchall())

root_widget = Builder.load_string("""
ScreenManager:
    Main_Screen:
        name: 'mainScreen'
        on_difficult: bouldering.load_from_difficult(self.difficult)
    Urec_facilities:
        name: 'urecFac'
    AdventureDirectory:
        name: 'AdventureDirectory'
    BoulderingDirectory:
        id: bouldering
        difficult: 'Beginner'
        name: 'BoulderingDirectory'

<Main_Screen>:
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: "mainScreenImage.png"

    Label:
        text: "Select your dificulty"
        font_size: 50
        color: (0.9,0.8,0,1)
        background_color: (0,0,0,0)
        pos_hint: {"x": 0, "y": 0.20}

    Button:
        text: 'Beginner'
        font_size: 30
        size_hint: 0.2,0.2
        color: (0.9,0.8,0,1)
        background_color: (0,0,0,0)
        pos_hint: {"x": 0.16, "y": 0.1}
        on_release:
            root.difficult =  "Beginner"
            app.root.current = 'urecFac'

    Button:
        text: 'Intermediate'
        font_size: 30
        size_hint: 0.2,0.2
        color: (0.9,0.8,0,1)
        background_color: (0,0,0,0)
        pos_hint: {"x": 0.41, "y": 0.1}
        on_release:
            root.difficult = "Intermediate"
            app.root.current = 'urecFac'

    Button:
        text: 'Advanced'
        font_size: 30
        size_hint: 0.2,0.2
        color: (0.9,0.8,0,1)
        background_color: (0,0,0,0)
        pos_hint: {"x": 0.66, "y": 0.1}
        on_release:
            root.difficult = "Advanced"
            app.root.current = 'urecFac'

<Urec_facilities>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Adventure Center"
            font_size: 50
            color: (0.9,0.8,0,1)
            background_normal: "adventureCenterImage.jpg"
            on_release: app.root.current = "AdventureDirectory"
        Button:
            background_normal: "mainScreenImage.png"
            text: "Back"
            font_size: 50
            color: (0.9,0.8,0,1)
            on_release: app.root.current = "mainScreen"

<AdventureDirectory>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Bouldering"
            font_size: 50
            color: (0.9,0.8,0,1)
            on_release:
                app.root.current = "BoulderingDirectory"

        Button:
            text: "Go back"
            font_size: 50
            color: (0.9,0.8,0,1)
            on_release:
                app.root.current = "urecFac"

<BoulderingDirectory>:
    BoxLayout:
        orientation: "vertical"
        Label:
            text: root.rows
            text_size: (root.width - 175), None
        Button:
            text: "Go back"
            font_size: 50
            color: (0.9,0.8,0,1)
            background_color: (0,0,0,1)
            on_release:
                app.root.current = "AdventureDirectory"

""")

class ScreenManagerApp(App):
    def build(self):
        return root_widget

if __name__ == '__main__':
    ScreenManagerApp().run()
0 голосов
/ 13 декабря 2018

Прежде чем использовать глобальную переменную в классе или функции, вы должны объявить, что переменная, на которую вы ссылаетесь, является глобальной переменной или создана как локальная переменная для этого определения.

Итак,делать

class BoulderingDirectory(Screen):
    global difficult
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...