2016-12-31 1 views
0

Ich möchte einen Wert von einem Zeitgeber in meinem main.py an eine ProgressBar in einer exit.kv-Datei übergeben, aber ich verwende eine Dateistruktur wie im Beispielkasten. Ich versuche eine Zeitschaltuhr zu machen, damit das Programm nicht versehentlich beendet wird. Ich müsste die Taste für ein paar Sekunden gedrückt halten.Wert aus einer Py-Datei in eine KV-Datei. Verwenden des Beispielsbeispiels

Ich habe viele Dinge ausprobiert, aber ich kann keine Lösung finden.

Das Projekt benötigen mehr Werte in der main.py lesen passieren (ein DAC auf meine Raspberry Pi verwenden) auf mehrere verschiedene .kv Dateien

Das ist mein erstes Kivy Projekt ist aber mein erstes Python-Projekt auch, so Die Lernkurve ist für mich steil.


EDIT:

Was ich brauche, um den Wert von (exit_time) Wert in der main.py Datei auf die ProgressBar (exit_bar) in der exit.kv-Datei übergeben werde um anzuzeigen, wie lange ich den Knopf (exit_button) drücken muss, bevor ich das Programm verlasse.

, wenn das Programm ausgeführt wird, wird die Python-Konsole, um den Countdown tun, aber ich kann es nicht in der ProgressBar (oder Etikett oder irgendetwas in der exit.kv Datei.

Wie finde ich, wenn ich zeigt, machen benötigen App zu nutzen oder root oder screen.ids.exit_bar.value oder was


EDIT wieder:..? Lösung

ich alles in der main.py über den Timer entnommen und diese in die main.py;

# 
# The Exit Timer, counting up to 20 from 0 before exiting. 
# If Press button start Timer. If button up, reset timer 
# 

    def my_callback(self, dt): 
     global exit_time 
     exit_time += 1 
     if exit_time == 101: 
      sys.exit("piMote stopped!") 
     self.time = exit_time 

    def start_exit_timer(self): 
     Clock.schedule_interval(self.my_callback, 0.01) 

    def stop_exit_timer(self): 
     global exit_time 
     Clock.unschedule(self.my_callback) 
     Clock.schedule_once(self.my_callback,0) 
     exit_time = -1 

Und dann änderte ich einen Teil der die exit.ky zu

ProgressBar: 
     id: exit_bar 
     max: 100 
     value: app.time 
     size_hint_x: .3 
     size_hint_y: None 
     height: '10dp' 

In Wirklichkeit alles, was ich self.time = exit_time“


tun musste, war das Hinzufügen

main.py

from time import time 
from kivy.app import App 
from os.path import dirname, join 
from kivy.lang import Builder 
from kivy.properties import NumericProperty, StringProperty, BooleanProperty,\ 
    ListProperty 
from kivy.clock import Clock 
from kivy.uix.screenmanager import Screen 
from kivy.uix.checkbox import CheckBox 
import os 
import sys 
from kivy.config import Config 


exit_time = 0 
timer_start = 0 

class ShowcaseScreen(Screen): 
    fullscreen = BooleanProperty(False) 
    def add_widget(self, *args): 
     if 'content' in self.ids: 
      return self.ids.content.add_widget(*args) 
     return super(ShowcaseScreen, self).add_widget(*args) 

class ShowcaseApp(App): 
    index = NumericProperty(-1) 
    current_title = StringProperty() 
    time = NumericProperty(0) 
    screen_names = ListProperty([]) 
    hierarchy = ListProperty([]) 
    exit_time = NumericProperty(21) 

    def build(self): 
     self.title = 'hello world' 
     self.screens = {} 
     self.available_screens = [ 
      'Exit'] 
     self.screen_names = self.available_screens 
     curdir = dirname(__file__) 
     self.available_screens = [join(curdir, 
      '{}.kv'.format(fn)) for fn in self.available_screens] 
     screen = self.load_screen(self.index +1) 
     self.current_title = screen.name 

# 
# choose the right screen from spinner 
# 

    def on_current_title(self, instance, value): 
     self.root.ids.spnr.text = value 

    def go_screen(self, idx): 

     print self.index 
     self.index = idx 
     self.root.ids.sm.switch_to(self.load_screen(idx), direction='left') 

    def load_screen(self, index): 
     if index in self.screens: 
      return self.screens[index] 
     screen = Builder.load_file(self.available_screens[index].lower()) 
     self.screens[index] = screen 
     return screen 

# 
# timer start for joystick and exit timer 
# 

    def __init__(self,**kwargs): 
     super(ShowcaseApp,self).__init__(**kwargs) 
     Clock.schedule_interval(self.my_timer, 0.1) 

# 
# The Exit Timer, counting up to 20 from 0 before exiting. 
# If Press button start Timer. If button up, reset timer 
# 

    def my_timer(screen, dt): 
     if timer_start == 1: 
      global exit_time 
      exit_time += 1 
      if exit_time == 21: 
       sys.exit("piMote stopped!") 
      print exit_time 
      return exit_time + 7 
     ################################################################# 
     # Need to do something here to make the timer-progressbar  # 
     # move, counting how long the button is pressed    # 
     ################################################################# 

    def start_exit_timer(self): 
     global timer_start 
     timer_start = 1 

    def stop_exit_timer(self): 
     global timer_start, exit_time 
     exit_time = 0 
     timer_start = 0 

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

showcase.kv

#:kivy 1.8.0 
#:import Factory kivy.factory.Factory 

<[email protected]> 
    background_color: .4, .4, .4, 1 

<[email protected]+ActionItem> 
    canvas.before: 
     Color: 
      rgba: 0.128, 0.128, 0.128, 1 
     Rectangle: 
      size: self.size 
      pos: self.pos 
    border: 27, 20, 12, 12 
    #background_normal: 'atlas://data/images/defaulttheme/action_group' 
    option_cls: Factory.ActionSpinnerOptions 

<ShowcaseScreen>: 
    ScrollView: 
     do_scroll_x: False 
     do_scroll_y: False if root.fullscreen else (content.height > root.height - dp(16)) 
     AnchorLayout: 
      size_hint_y: None 
      height: root.height if root.fullscreen else max(root.height, content.height) 
      GridLayout: 
       id: content 
       cols: 1 
       spacing: '8dp' 
       padding: '8dp' 
       size_hint: (1, 1) if root.fullscreen else (.8, None) 
       height: self.height if root.fullscreen else self.minimum_height 

BoxLayout: 
    orientation: 'vertical' 

    canvas.before: 
     Color: 
      rgb: .6, .6, .6 
     Rectangle: 
      size: self.size 
      #source: 'data/background.png' 

    ActionBar: 

     ActionView: 
      id: av 
      ActionPrevious: 
       title: 'piMote' 

      ActionSpinner: 
       id: spnr 
       important: True 
       text: 'Jump to Screen' 
       values: app.screen_names 
       on_text: 
        if sm.current != args[1]:\ 
        idx = app.screen_names.index(args[1]);\ 
        app.go_screen(idx) 

    ScreenManager: 
     id: sm 
     on_current_screen: 
      spnr.text = args[1].name 
      idx = app.screen_names.index(args[1].name) 
      if idx > -1: app.hierarchy.append(idx) 

exit.kv

ShowcaseScreen: 
    name: 'Exit' 

    Label: 
     id: exit_label1 
     text: "Are you really sure\n you want to quit?" 
     size_hint_y: None 
     height: '36dp' 

    ProgressBar: 
     id: exit_bar 
     max: 20 
     #value: app.my_timer() 
     size_hint_x: .3 
     size_hint_y: None 
     height: '10dp' 

    Button: 
     id: exit_button 
     text: "Yes" 
     size_hint_x: .2 
     size_hint_y: None 
     height: '48dp' 
     on_press: app.start_exit_timer() 
     on_release: app.stop_exit_timer() 
+0

TL, TR: Können Sie Ihr Beispiel vereinfachen. Veröffentlichen Sie Ihren Stacktrace. –

+0

Ich weiß nicht, wie ich mein Beispiel vereinfachen und es so funktionieren lassen kann, wie es sollte. Wenn ich mehr davon schneide, wird es nicht wie geplant funktionieren. – PunyViking

+0

Ich weiß nicht, was ein StackTrace ist, also kann ich es nicht posten ... Entschuldigung! – PunyViking

Antwort

0

Ihre Lösung ein bisschen zu kompliziert ist ... kann man nur die Zeit messen, die seit der Presse übergeben und beenden Sie entscheiden.

#forget about all the timers code... 
import time #gonna need this 
EXIT_BUTTON_TIME = 2.0 # 2 seconds is OK? 
... 

    def exit_button_pressed(self): 
     self.exit_pressed = time.time() 


    def exit_button_release(self): 
     if time.time() - self.exit_pressed > EXIT_BUTTON_TIME: 
      exit() # or something else you want to do 

Ändern Sie auch die Funktionsnamen in der KV-Datei ...

... 
    on_press: app.exit_button_pressed() 
    on_release: app.exit_button_release() 

bin ich nicht sagen, dass Ihr Ansatz kann nicht Arbeit, aber es ist komplexer (import this)

+0

Danke, ich habe schon über diese Lösung nachgedacht. Das "Problem" mit deiner Lösung ist nicht wirklich ein Problem, aber ich muss in der Lage sein, später in diesem Projekt andere Werte an andere kv-Dateien zu übergeben. Ich mache eine Fernbedienung für meine Roboter, und ich muss in der Lage sein, die Position der Joysticks zu lesen und die Werte in einem KV-Bildschirm anzuzeigen. – PunyViking

+0

@PunyViking - Sie müssen eine weitere, prägnantere Frage zum Übergeben von Parametern schreiben, da die obige Frage nicht klar genug ist. –

Verwandte Themen