(未完成)Pyglet实现SideBar
时间:2020-05-30
本文章向大家介绍(未完成)Pyglet实现SideBar,主要包括(未完成)Pyglet实现SideBar使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
import pyglet class Window(pyglet.window.Window): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def attach(self, widget): def __on_draw(): self.clear() widget.on_draw(self.width, self.height) def __on_mouse_press(x, y, button, modifiers): widget.on_mouse_press(x, self.height-y, button, modifiers) def __on_mouse_motion(x, y, dx, dy): widget.on_mouse_motion(x, self.height-y, dx, -dy) def __on_key_press(symbol, modifiers): widget.on_key_press(symbol, modifiers) self.push_handlers(on_draw = __on_draw) self.push_handlers(on_mouse_press = __on_mouse_press) self.push_handlers(on_mouse_motion = __on_mouse_motion) self.push_handlers(on_key_press = __on_key_press) class Color(): White = (255, 255, 255) Black = (0, 0, 0) Green = (0, 255, 0) Blue = (0, 0, 255) class BaseWidget(): def __init__(self): self.x = 0 self.y = 0 self.width = 0 self.height = 0 self.text = "" self.text_x = 0 self.visible = True self.active = True self.color = Color.White def __del__(self): pass def __draw(self, mode, window_width, window_height): ny = window_height - self.y points = (self.x, ny, self.x+self.width, ny, self.x+self.width, ny-self.height, self.x, ny-self.height) colors = [] for i in range(4): colors.extend(self.color) pyglet.graphics.draw(4, mode, ("v2i", points), ("c3B", colors)) # def draw_line_loop(self, ): # self.draw(pyglet.gl.GL_LINE_LOOP) def draw_rectangle(self, window_width, window_height): self.__draw(pyglet.gl.GL_QUADS, window_width, window_height) def is_within_area(self, x, y): if x >= self.x and x <= self.x+self.width: if y >= self.y and y <= self.y+self.height: return True return False def on_draw(self, window_width, window_height): pass def on_mouse_press(self, x, y, button, modifiers): pass def on_mouse_motion(self, x, y, dx, dy): pass def on_key_press(self, symbol, modifiers): pass class PaneWidget(BaseWidget): def __init__(self): super().__init__() self.widgets = [] # self.selected_widget = None def add(self, widget): self.widgets.append(widget) def on_draw(self, window_width, window_height): for widget in self.widgets: widget.on_draw(window_width, window_height) def on_mouse_press(self, x, y, button, modifiers): for widget in self.widgets: widget.on_mouse_press(x, y, button, modifiers) def on_mouse_motion(self, x, y, dx, dy): for widget in self.widgets: widget.on_mouse_motion(x, y, dx, dy) def on_key_press(self, symbol, modifiers): for widget in self.widgets: widget.on_key_press(symbol, modifiers) class Node(): def __init__(self): self.widget = None self.nodes = [] class TreeWidget(BaseWidget): def __init__(self): super().__init__() self.root = Node() self.selected_node = self.root def add(self, widget): node = Node() node.widget = widget self.selected_node.nodes.append(node) height = self.update() * widget.height if height > self.height: self.height = height def update(self): return self.__update(self.root, 0, 0) def on_draw(self, window_width, window_height): if self.selected_node != self.root: self.selected_node.widget.color = Color.Blue self.__on_draw(self.root, window_width, window_height) def on_mouse_press(self, x, y, button, modifiers): self.__on_mouse_press(self.root, x, y, button, modifiers) def on_mouse_motion(self, x, y, dx, dy): self.__on_mouse_motion(self.root, x, y, dx, dy) def __update(self, next_node, depth, height): for node in next_node.nodes: # node.widget.x = self.x + depth*20 node.widget.text_x = self.x + depth*20 node.widget.y = self.y + height*node.widget.height # node.widget.width = self.width # node.widget.height = 20 height = self.__update(node, depth + 1, height + 1) return height def __on_draw(self, next_node, window_width, window_height): for node in next_node.nodes: node.widget.on_draw(window_width, window_height) self.__on_draw(node, window_width, window_height) def __on_mouse_press(self, next_node, x, y, button, modifiers): for node in next_node.nodes: if node.widget.on_mouse_press(x, y, button, modifiers): if self.selected_node != self.root: self.selected_node.widget.color = Color.White self.selected_node = node self.__on_mouse_press(node, x, y, button, modifiers) def __on_mouse_motion(self, next_node, x, y, dx, dy): for node in next_node.nodes: node.widget.on_mouse_motion(x, y, dx, dy) self.__on_mouse_motion(node, x, y, dx, dy) class Item(BaseWidget): def __init__(self): super().__init__() def on_draw(self, window_width, window_height): self.draw_rectangle(window_width, window_height) def on_mouse_press(self, x, y, button, modifiers): if self.is_within_area(x, y): if button == pyglet.window.mouse.LEFT or button == pyglet.window.mouse.RIGHT: return True return False def on_mouse_motion(self, x, y, dx, dy): if self.is_within_area(x, y): self.color = Color.Green else: self.color = Color.White class Sidebar(TreeWidget): def __init__(self): super().__init__() def add(self, widget): widget.x = self.x widget.y = self.y widget.width = self.width widget.height = 20 super().add(widget) def on_draw(self, window_width, window_height): self.draw_rectangle(window_width, window_height) super().on_draw(window_width, window_height)
class Form(PaneWidget): def __init__(self): super().__init__() self.sidebar = None # self.menu = None self.init_component() self.test() def init_component(self): self.sidebar = Sidebar() self.sidebar.x = 10 self.sidebar.y = 10 self.sidebar.width = 100 self.sidebar.height = 200 self.add(self.sidebar) # self.menu = Menu() # self.menu.width = 80 # self.menu.active = False # self.add(self.menu) def on_mouse_press(self, x, y, button, modifiers): super().on_mouse_press(x, y, button, modifiers) # if button == pyglet.window.mouse.RIGHT: # widget = self.sidebar.selected_node.widget # if widget != None and widget.is_within_area(x, y): # if self.menu.active: # if self.menu.is_within_area(x, y) == False: # self.menu.x = x # self.menu.y = y # else: # self.menu.x = x # self.menu.y = y # self.menu.active = True def on_key_press(self, symbol, modifiers): super().on_key_press(symbol, modifiers) if symbol == pyglet.window.key.N: self.sidebar.add(Item()) def test(self): self.sidebar.add(Item()) self.sidebar.add(Item()) self.sidebar.add(Item())
from widget import * if __name__ == "__main__": window = Window() form = Form() window.attach(form) pyglet.app.run()
原文地址:https://www.cnblogs.com/howld/p/12994093.html
- Linux下锁定账号,禁止登录系统的设置总结
- 深度解析 TypeConverter & TypeConverterAttribute (一)
- 从MapX到MapXtreme2004[7]-对Table、Feature等的理解
- 互联网赋能传统装企 “科技撬动力巨大”
- Python接口自动化-8-测试报告
- http应用优化和加速说明-负载均衡
- linux负载均衡总结性说明(四层负载/七层负载)
- 从MapX到MapXtreme2004[6]-标点心得
- silverlight3中的"伪"3D
- 暴利驱动的疯狂游戏“外挂”:非法获利可达数百万;X-Agent 后门大升级,俄罗斯 APT28 间谍活动更为隐蔽
- Nginx+keepalived双机热备(主从模式)
- 即使不做程序员,也要学会像程序员一样去思考
- 这5项高科技 正在颠覆未来医疗
- xml的解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Qt音视频开发22-通用GPU显示
- 通吃岛屿问题
- 堂妹问我:Dubbo的服务暴露过程
- LeetCode 657. 机器人能否返回原点
- ! [rejected] master -> master (fetch first)
- Mybatis源码学习(二)Mapper动态代理
- Mybatis源码学习(三)executor
- Mybatis源码学习(四)拦截器与插件原理
- SpringBoot如何使用注解装配Bean
- Spring Boot 如何快速实现定时任务
- Django 实现文件上传下载API
- 【原创】Spring Boot 如何手写stater
- 【原创】Spring Boot 过滤器、监听器、拦截器的使用
- 关于useState的一切
- 关于useEffect的一切