Ajout du GUI
This commit is contained in:
80
kivy/tools/kviewer.py
Normal file
80
kivy/tools/kviewer.py
Normal file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python
|
||||
'''
|
||||
KViewer
|
||||
=======
|
||||
|
||||
KViewer, for KV-Viewer, is a simple tool allowing you to dynamically display
|
||||
a KV file, taking its changes into account (thanks to watchdog). The
|
||||
idea is to facilitate design using the KV language. It's somewhat related to
|
||||
the KivyCatalog demo, except it uses an on-disc file, allowing the user to use
|
||||
any editor.
|
||||
|
||||
You can use the script as follows::
|
||||
|
||||
python kviewer.py ./test.kv
|
||||
|
||||
This will display the test.kv and automatically update the display when the
|
||||
file changes.
|
||||
|
||||
.. note: This scripts uses watchdog to listen for file changes. To install
|
||||
watchdog::
|
||||
|
||||
pip install watchdog
|
||||
|
||||
'''
|
||||
|
||||
from sys import argv
|
||||
from kivy.lang import Builder
|
||||
from kivy.app import App
|
||||
from kivy.core.window import Window
|
||||
from kivy.clock import Clock, mainthread
|
||||
from kivy.uix.label import Label
|
||||
|
||||
from watchdog.observers import Observer
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
from os.path import dirname, basename, join
|
||||
|
||||
|
||||
if len(argv) != 2:
|
||||
print('usage: %s filename.kv' % argv[0])
|
||||
exit(1)
|
||||
|
||||
|
||||
PATH = dirname(argv[1])
|
||||
TARGET = basename(argv[1])
|
||||
|
||||
|
||||
class KvHandler(FileSystemEventHandler):
|
||||
def __init__(self, callback, target, **kwargs):
|
||||
super(KvHandler, self).__init__(**kwargs)
|
||||
self.callback = callback
|
||||
self.target = target
|
||||
|
||||
def on_any_event(self, event):
|
||||
if basename(event.src_path) == self.target:
|
||||
self.callback()
|
||||
|
||||
|
||||
class KvViewerApp(App):
|
||||
def build(self):
|
||||
o = Observer()
|
||||
o.schedule(KvHandler(self.update, TARGET), PATH)
|
||||
o.start()
|
||||
Clock.schedule_once(self.update, 1)
|
||||
return super(KvViewerApp, self).build()
|
||||
|
||||
@mainthread
|
||||
def update(self, *args):
|
||||
Builder.unload_file(join(PATH, TARGET))
|
||||
for w in Window.children[:]:
|
||||
Window.remove_widget(w)
|
||||
try:
|
||||
Window.add_widget(Builder.load_file(join(PATH, TARGET)))
|
||||
except Exception as e:
|
||||
Window.add_widget(Label(text=(
|
||||
e.message if getattr(e, r'message', None) else str(e)
|
||||
)))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
KvViewerApp().run()
|
||||
Reference in New Issue
Block a user