- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Gtk3 的 python 包装器的使用文档有些有限。我找到了几个常见的小部件示例。我正在尝试使用 Gtk.GLArea 小部件。 API 文档是针对 C 的,我没有太多运气猜测使用这个小部件的等效 python 调用。在示例中,小部件是使用以下 C 代码创建的:
// create a GtkGLArea instance
GtkWidget *gl_area = gtk_gl_area_new ();
g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);
然后渲染函数中有OpenGL命令:
static gboolean
render (GtkGLArea *area, GdkGLContext *context)
{
// inside this function it's safe to use GL; the given
// #GdkGLContext has been made current to the drawable
// surface used by the #GtkGLArea and the viewport has
// already been set to be the size of the allocation
// we can start by clearing the buffer
glClearColor (0, 0, 0, 0);
glClear (GL_COLOR_BUFFER_BIT);
// draw your object
draw_an_object ();
// we completed our drawing; the draw commands will be
// flushed at the end of the signal emission chain, and
// the buffers will be drawn on the window
return TRUE;
}
我的问题是如何在 python 中执行等效操作?
这是我的尝试:
class RootWidget(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='GL Example')
self.set_default_size(800,500)
gl = Gtk.GLArea()
gl.connect("render", self.gl_render)
self.add(gl)
def gl_render(self, gl):
print(gl)
Gtk.glClearColor(0,0,0,1)
Gtk.glClear(Gtk.GL_COLOR_BUFFER_BIT)
return True
你会注意到我添加了“Gtk”。到 gl 命令。不确定这是否正确,但 python 不知道函数中的 glClearColor 是什么。我对 C 命名空间不太熟悉,但我也不知道 C 函数如何理解 gl 命令是什么。该程序确实运行,并且我在控制台中收到以下错误:
fb setup not supported
(python.exe:120048): Gdk-WARNING **: Compile failure in fragmentshader:
ERROR: 0:5: 'gl_FragColor' : undeclared identifier
ERROR: 0:5: 'texture2D' : no matching overloaded function found (usingimplicit conversion)
对此的任何输入都会有用。我的希望是能够使用 opengl 命令在固定的小部件区域中进行绘制。
编辑:这是我的最新尝试。在 on_render()
函数我打印上下文,并且确实看到上下文属性设置为 <gtk.gdk.Win32GLContext object at 0x3f133f0>
调试确实表明那是当前上下文。问题是我仍然遇到相同的着色器、Frag_Color 和纹理错误,而且我什至没有调用任何 gl 命令。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from OpenGL.GL import *
from OpenGL.GLU import *
class MyGLArea(Gtk.GLArea):
def __init__(self):
Gtk.GLArea.__init__(self)
self.connect("realize", self.on_realize)
def on_realize(self, area):
ctx = self.get_context()
ctx.make_current()
print("The context is {}".format(self.get_property("context")))
err = self.get_error()
if err:
print(err)
return
class RootWidget(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='GL Example')
self.set_default_size(800,500)
gl_area = MyGLArea()
self.add(gl_area)
win = RootWidget()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
编辑2:似乎我只是遇到了 GLArea 小部件的安装问题。看起来很奇怪,因为我使用了 30 多个不同的 Gtk 小部件,没有出现任何问题。我在添加小部件时遇到错误,甚至没有发送命令。我在 Ubuntu python 解释器中运行代码,创建小部件时没有任何错误。我在使用某些 GL 命令时遇到一些问题,但可能来 self 安装的 python 包装器。我仍在寻找相当于 pygame 或 glut 的 init 的小部件,并设置投影函数来设置视口(viewport)。如果有人有想法,我很想听听。以下代码运行时没有错误:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from OpenGL.GL import *
from OpenGL.GLU import *
class MyGLArea(Gtk.GLArea):
def __init__(self):
Gtk.GLArea.__init__(self)
self.connect("realize", self.on_realize)
self.connect("render", self.render)
def on_realize(self, area):
ctx = self.get_context()
ctx.make_current()
err = self.get_error()
if err:
print("The error is {}".format(err))
def render(self, area, ctx):
glClearColor(1,0,0,1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
return True
class RootWidget(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='GL Example')
self.set_default_size(800,500)
gl_area = MyGLArea()
self.add(gl_area)
win = RootWidget()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
最佳答案
使用 Windows 的一体式安装程序时,我注意到有一个 OpenGL 扩展至 GTK+ 的选项。现在它按预期工作了。这是一些工作代码:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from OpenGL.GL import *
from OpenGL.GL import shaders
import numpy as np
FRAGMENT_SOURCE ='''
#version 330
in vec4 inputColor;
out vec4 outputColor;
void main(){
outputColor = vec4(1.0,0.0,0.0,1.0);//constant red. I know it's a poor shader
};'''
VERTEX_SOURCE = '''
#version 330
in vec4 position;
void main(){
gl_Position = position;
}'''
class MyGLArea(Gtk.GLArea):
def __init__(self):
Gtk.GLArea.__init__(self)
self.connect("realize", self.on_realize)
self.connect("render", self.on_render)
def on_realize(self, area):
ctx = self.get_context()
print("realized", ctx)
def on_render(self, area, ctx):
ctx.make_current()
glClearColor(0, 0, 0, 1)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
VERTEX_SHADER_PROG = shaders.compileShader(VERTEX_SOURCE, GL_VERTEX_SHADER)
FRAGMENT_SHADER_PROG = shaders.compileShader(FRAGMENT_SOURCE, GL_FRAGMENT_SHADER)
self.shader_prog = shaders.compileProgram(VERTEX_SHADER_PROG, FRAGMENT_SHADER_PROG)
self.create_object()
def create_object(self):
# Create a new VAO (Vertex Array Object) and bind it
vertex_array_object = glGenVertexArrays(1)
glBindVertexArray(vertex_array_object)
# Generate buffers to hold our vertices
vertex_buffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
# Get the position of the 'position' in parameter of our shader and bind it.
position = glGetAttribLocation(self.shader_prog, 'position')
glEnableVertexAttribArray(position)
# Describe the position data layout in the buffer
glVertexAttribPointer(position, 3, GL_FLOAT, False, 0, ctypes.c_void_p(0))
# Send the data over to the buffer
vertices = np.array([-0.6, -0.6, 0.0,
0.0, 0.6, 0.0,
0.6, -0.6, 0.0,
0.7, -0.1, 0.0,
0.8, 0.1, 0.0,
0.9, -0.1, 0.0
], dtype=np.float32)
glBufferData(GL_ARRAY_BUFFER, 96, vertices, GL_STATIC_DRAW)
# Unbind the VAO first (Important)
glBindVertexArray(0)
# Unbind other stuff
glDisableVertexAttribArray(position)
glBindBuffer(GL_ARRAY_BUFFER, 0)
self.display(vertex_array_object)
def display(self, vert):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glUseProgram(self.shader_prog)
glBindVertexArray(vert)
glDrawArrays(GL_TRIANGLES, 0, 3)
glDrawArrays(GL_TRIANGLES, 4, 3)
glBindVertexArray(0)
glUseProgram(0)
class RootWidget(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='GL Example')
self.set_default_size(800, 500)
gl_area = MyGLArea()
gl_area.set_has_depth_buffer(False)
gl_area.set_has_stencil_buffer(False)
self.add(gl_area)
win = RootWidget()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
关于opengl - Pygobject GTK3 中 Gtk.GLArea 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47565884/
我正在尝试使用 GTK 构建一个 hello world,其中包括以下行: #include 如你所料。 提供的 Makefile 包含以下行: GTK_INCLUDE = -I/usr/local
我对 GTK 术语感到困惑。根据Wikipedia ,似乎有与 GTK+ 的绑定(bind),称为 GTK (GtkAda) 和 GTK2 (gtk2hs、Gtk2-Perl)。 有人可以帮我解决这个
我在 Gtk.Fixed 中有一个 Gtk.TextView,我设置了它的宽度和高度以及换行模式。 我的问题是,当用户插入的文本多于设置大小时,我需要避免 TextView 扩展。在那种情况下,我只需
我考虑使用带有 Broadway 后端的 GTK+ 来开发设备控制应用程序。 设备的功能类似于宽带调制解调器/路由器(我特意选择了所有人都熟悉的示例 :-))。 设备应通过网络浏览器远程控制。 我担心
我想更改 Windows 的默认 GTK 主题。我知道该怎么做:通过修改 settings.ini 文件,或者像这样: settings = gtk_settings_get_default(); g
在 GTK+ 3 中将多个键盘快捷键绑定(bind)到一个操作的最佳方法是什么? 这几天我一直在寻找这个问题的答案,但一无所获。函数 gtk_accelerator_parse 不支持逗号分隔的快捷方
虽然 Gtk.table 已被弃用,但我用它获得了更好的结果,而不是推荐的 Gtk.Grid。 这可能是我的错误,但我找不到问题。 我的目标是创建一个 Gtk 窗口,顶部有一个笔记本,下面有两个按钮。
虽然 Gtk.table 已被弃用,但我用它获得了更好的结果,而不是推荐的 Gtk.Grid。 这可能是我的错误,但我找不到问题。 我的目标是创建一个 Gtk 窗口,顶部有一个笔记本,下面有两个按钮。
是否可以在辅助线程而不是主线程中运行 GTK 的主循环? 最佳答案 是的,您可以在任何线程中使用主循环,但您只能从创建它的线程访问它。 但是,这不是一件常见的事情,并且可能有更好的方法来做您想做的任何
我从一个空表开始(只有一列的列表存储) 我希望用户能够导入 CSV 文件并显示内容。导入文件有效,确实显示了 CSV 数据,但保留了原始列(标题为“无数据”)。我该如何摆脱它? 我已经尝试删除 Tre
我正在尝试找出是否可以使用适用于 Windows 的 Python 3.2.2 或更高版本编写基于 Python 的 Windows 桌面小部件。上述项目完全令人困惑。他们中的任何一个支持我正在寻找的
我正在构建一个使用 kivy 的 cefpython 小部件的 Kivy 应用程序。 在执行我的程序时,每当我将文本输入小部件添加到 View 中时,我的应用程序都会崩溃并出现以下错误: Gtk-ER
Vala 中的源代码: using GLib; using Gtk; class MainWindow : Window { public static int main (string[] a
为什么 set_size_request(800,600) 在 DrawingArea 小部件上调用(也用 Gtk.Button 测试)导致大小为 958 x 791 px 的窗口,而在 Window
当我手动构建项目时,它会正确构建: gcc main.c -o midget `pkg-config --cflags --libs gtk+-3.0` 当我尝试使用 Makefile 时,它失败
如果有人对 the following function 有任何经验,我很感兴趣gtk.Window/gtk.Widget 的 shape_combine_mask(shape_mask, offs
如果我正在编写一个想要通过使用颜色来传达一些信息的应用程序,我该如何更改给定小部件的背景色和前景色?如果可能的话,我想知道如何在空地中做到这一点,以及以编程方式(计算颜色)。 我也想知道如何对复杂的小
假设有问题的小部件是一个包含一个标签和两个按钮的 VBox。 此外,假设所需的旋转角度为 90°。 如何旋转它?我认为默认情况下这是不可能的,但我认为这是可能的。 但是,我不知道如何开始。我要编写自定
我想知道当 Gtk.Window 完全显示时发出哪个信号,完全显示是指显示窗口本身及其小部件。 我尝试了几个信号: 展示 意识到 可见性通知事件 设置焦点 但它们都无法正常工作。 我在网上找到的唯一有
GTK+ Button 小部件具有控制焦点获取的 focus_on_click 属性。但是我使用的 MenuToolButton 没有这样的属性。我不想关注点击。 如何摆脱它?谢谢! 最佳答案 如果您
我是一名优秀的程序员,十分优秀!