0

我正在寻找一种在 python 中为应用程序创建前端的解决方案。我对 Tk(但它不是我想使用 wxpython 的基础)和标准小部件有一些经验,但现在我的项目对我来说太复杂了。该应用程序就像一个多媒体演示构建器或调度程序,其中我可以使用的元素是图片、视频、声音和其他作为执行某事的命令以及我决定何时开始查看每个元素的位置。我没有找到任何可以使用的标准小部件,所以我制作了一个类似于多轨音频或视频编辑器的界面模型,

模型图像是http://tinypic.com/r/4gqnap/5

您可以在图片中看到我的想法:在某些频道中,我可以放置不同的对象,例如图片、视频、串行命令和 foreach,我可以设置开始的时刻和持续时间。当我按下播放时,时间线光标移动并且当它到达通道中对象的开始点时,对象“开始”以查看或执行视频或其他内容。当我不玩时,我可以控制时间线滚动,频道滚动以添加我需要的频道。图片和视频将在其他专用帧上观看:每个频道一个帧。是否存在一个类似的前端,我可以从中获得想法?或有关如何构建类似内容的说明?

谢谢大家。

乔治奥

4

1 回答 1

0

这是一个非常模糊的问题.. 但是我们开始吧.. 我会跳过大多数传统模块(例如 Tk 或 wxPython,但它们可以为您工作)。

我通常向任何对 GUI 开发或任何图形方面感兴趣的人展示 Pyglet 选项。

这是一个简短的拖放示例:

#!/usr/bin/python
import pyglet
from time import time, sleep

class Window(pyglet.window.Window):
    def __init__(self, refreshrate):
        super(Window, self).__init__(vsync = False)
        self.frames = 0
        self.framerate = pyglet.text.Label(text='Unknown', font_name='Verdana', font_size=8, x=10, y=10, color=(255,255,255,255))
        self.last = time()
        self.alive = 1
        self.refreshrate = refreshrate
        self.click = None
        self.drag = False

    def on_draw(self):
        self.render()

    def on_mouse_press(self, x, y, button, modifiers):
        self.click = x,y

    def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
        if self.click:
            self.drag = True
            print 'Drag offset:',(dx,dy)

    def on_mouse_release(self, x, y, button, modifiers):
        if not self.drag and self.click:
            print 'You clicked here', self.click, 'Relese point:',(x,y)
        else:
            print 'You draged from', self.click, 'to:',(x,y)
        self.click = None
        self.drag = False

    def render(self):
        self.clear()
        if time() - self.last >= 1:
            self.framerate.text = str(self.frames)
            self.frames = 0
            self.last = time()
        else:
            self.frames += 1
        self.framerate.draw()
        self.flip()

    def on_close(self):
        self.alive = 0

    def run(self):
        while self.alive:
            self.render()
            # ----> Note: <----
            #  Without self.dispatc_events() the screen will freeze
            #  due to the fact that i don't call pyglet.app.run(),
            #  because i like to have the control when and what locks
            #  the application, since pyglet.app.run() is a locking call.
            event = self.dispatch_events()
            sleep(1.0/self.refreshrate)

win = Window(23) # set the fps
win.run()

在这里,您必须创建自己的对象(文本框、滑块等),但您可以完全控制它们。

我已经构建了一些 (8-13) 大型 GUI 应用程序,如果您不想使用砖块外观按钮和通用颜色方案,这是最干净的方法。

此外,请参阅此线程以及更多关于 GUI 讨论的内容,最好的模块是什么等:

对于 Pyglet:

于 2013-05-06T15:31:38.083 回答