81 lines
2.1 KiB
Python
81 lines
2.1 KiB
Python
|
#!/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()
|