问题标签 [fyne]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1361 浏览

user-interface - 如何安装 opengl 以使其运行

我正在尝试遵循简单的代码来使用Fyne包创建 GUI:

它编译和构建可执行文件没有任何错误甚至警告,但是在尝试运行它时会出现以下错误:

正如Fyne 主页上给出的,我需要安装 OpenGL。从OpenGL 的 go bindings来看,似乎有三种安装方法:

我需要使用以下哪些命令?我正在研究Windows7和使用go version go1.12.9 windows/386

谢谢你的帮助。

编辑:

我尝试了以下命令:

他们都安装得很好,但是在尝试运行构建的可执行文件时仍然存在同样的错误。

我也尝试了gles2,但它没有安装而是给出以下错误:

0 投票
1 回答
1340 浏览

user-interface - 增加这个简单的 go gui 应用程序的默认字体大小

我正在使用以下简单的演示代码来创建一个使用Fyne包的 GUI:

它可以正常工作,但我想增加这个 GUI 的默认字体大小(以便标签、按钮和任何其他小部件(如可能添加到其中的条目)中的字体大小应该增加)。

我看到有可以theme使用的对象(带有 TextSize() 函数),但我无法使用它来增加字体大小。里面还有一个RenderedTextSize(string, int, TextStyle) Sizetype Driver interface

如何在这个简单的 GUI 应用程序中增加默认字体?谢谢你的帮助。

0 投票
2 回答
1770 浏览

user-interface - 如何更改 GUI 组件的颜色

我正在尝试以下演示代码fyne

它运行正常,但我想将标签的颜色更改为蓝色,将按钮的颜色更改为绿色。我看到有,theme但这似乎是针对整个应用程序而不是针对单个元素。

如何将不同的颜色应用于不同的 GUI 组件?谢谢你的帮助。

0 投票
2 回答
2005 浏览

go - How to add padding, font size and colours to fyne UI app

I have this sample app code below for a UI I'm implementing using the fyne toolkit, and cant figure out how to align the buttons to the left, makes top text bigger, and add colours.

I've tried trying to create a custom theme to implement the UI features I need, but my understanding of the godoc for the fyne toolkit is lacking. Is there a doc someone can point me to to make this work? or provide me with some pointers, as the toolkit is poorly documented

this is my sample app code

0 投票
1 回答
563 浏览

go - 使用 fyne.io 捕获键盘按下事件

下面的代码创建了一个新的应用程序窗口以显示来自本地文件系统的图片,如何添加支持以检测“按键”事件并退出应用程序?

0 投票
1 回答
654 浏览

go - 如何让小部件承认它们真正可以处理的事件

我在 Go 和 Fyne 上苦苦挣扎,对两者都很陌生,而且太习惯于 C++、Python 和其他 OO 语言。我试图让许多不同类型的 Fyne 小部件具有某些常见行为,但我迷路了。例如,我需要在许多小部件(如标签和按钮)上创建变体,以允许我捕捉右键单击(TapSecondary),以便我可以做一些特别的事情(通常是弹出一个菜单)。是的,我想要按钮和标签之类的弹出菜单;我什至想在输入框上截取它(即使我必须以这种方式自己实现粘贴。)

我在网上找到了一个示例,该示例可以让我拦截对标签的点击:

所以,它有效。我可以调用 NewTapLabelWithStyle 并将其传递给 tappedLeft 和 tappedRight 函数,当我单击标签时它们会被调用。

问题是,如果我没有在网上找到该代码示例,我将永远不会知道或能够计算出 Label 允许您在组合结构中定义 TappedSecondary 和 Tapped 并以这种方式捕获事物。我需要在各种小部件上捕捉这些事件和其他事件,例如符文和钥匙。我在哪里可以找到小部件悄悄支持但在https://godoc.org/中未提及的功能名称?我知道这与接口有关,因为代码示例提到,如果您不为 Tapped 和 TappedSecondary 创建定义,即使您只想要一个,也不会起作用。某处有能力询问每个小部件支持哪些接口并采取相应的行动,但该机制在哪里定义?

(Go 让我想念 C++,你可以在其中定义一个 Widget 类并为所有可能的鼠标、键等事件提供虚拟挂钩,然后你可以根据需要覆盖并执行操作,根据定义,这一切都是可见的。这似乎更加晦涩难懂。)

编辑:因此,如果我正确阅读了答案,Go 有一些方法可以查询接收输入的小部件是否实现了各种接口。在某处,必须有相当于

它是如何做到的?像“is”这样的动词在 Python 中是有意义的,而 C++ 的等价物是 dynamic_cast 和对 nullptr 的检查,但 Go 是如何提供的呢?我希望一旦我知道语法,我就可以搜索 go 代码库并找到哪些小部件处理哪些接口。

0 投票
1 回答
127 浏览

go - 导航并添加到 TabItem 中的内容

我有一个特定的、也许是不寻常的问题,涉及在 Fyne 中构建 GUI。我的应用程序是选项卡式的;也就是窗口中的第一件事是 TabContainer。所有其他要放置在应用程序中的小部件都是在服务器的方向上动态放置的,服务器会向下发送一系列指令,例如“在选项卡 2、第 4 行、第 3 列中,放置一个条目小部件”等。需要明确的是,应用程序将使每个 TabItem 都成为一组垂直 Box 小部件,每个小部件都将包含一组水平框。把它想象成一个参差不齐的网格,没有尝试在每个选项卡中排列列。

我的困惑是:当我从服务器获得指令时,我可能(通常会!)必须扩展 TabItem 上的 VBoxes,和/或所选 VBox 中的 HBoxes。所以我想去 TabItem 并询问它已经有多少个 VBox,然后根据需要添加更多,并且同上该垂直 Box 中的水平 Box。但我不知道该怎么问。

给定选项卡编号,访问 TabItem 并不难:tc.Items[tabNumber] 让我知道,我可以使用 tc.Items[tabNumber].Content 访问内容。问题是,我知道内容是一个盒子,我(通常)想添加到它。但是编译器并没有忍受我的尝试:

编译错误是有道理的;这大概不是一个合理的演员阵容。在 C++ 中,我会打破 dynamic_cast 并且很好。作为 Go 新手,我不知道如何管理等效项。

我知道我可以在旁边安排一组地图的地图来容纳我的盒子;严格来说,我不需要询问标签容器它们包含什么,因为我可以单独跟踪它们。但这感觉不对;我在复制 Fyne 已经拥有的知识,如果我知道如何挖掘它就好了。当我从服务器获得命令开始删除一些小部件时,我将做很多并行工作,管理 Tab 容器和我的地图。

什么是优雅的解决方案?

0 投票
2 回答
352 浏览

go - 使用 Select Widget 时我是如何做到恐慌的

Go 和 Fyne 的新手,在试图从 Fyne 获得我需要的东西时跌跌撞撞。对不起,这会很长。

我的问题是这个。我正在编写一个从服务器获取命令列表的应用程序,告诉它创建一系列小部件并显示它们。它们有多种类型——标签、按钮、条目、选择等。

但这些不是标准的小部件;我需要稍微扩展他们的行为。一方面,当由用户操作时,他们每个人都需要访问一些每个小部件的信息。例如,按钮单击必须引用特定于该按钮的一些数据,以便它知道要做什么。我们将这些附加信息称为 About 结构。

其次,每个小部件都需要能够右键单击并下拉小部件特定菜单。是的,即使是按钮和标签也需要能够提供下拉菜单。对于像 Entry 这样的小部件,我知道这种设计会让我不得不为粘贴、复制和 Entry 通常在右键单击时提供的其他操作编写自己的菜单选项,但我对此表示满意。

我已经完成了所有这些工作,但在此过程中我破坏了 Select(并且可能会损坏其他小部件。)而且我看不到如何修复它。

问题:尝试发送 Select 小部件会导致恐慌:接口转换:fyne.Canvas 为 nil,而不是 *glfw.glCanvas

方法:

现在我必须捕获所有“事件”,以便 GenericWidget 看到它们:

这应该代表任何单个小部件,无论类型如何。这并不复杂:当驱动程序调用 Tapped 时,会调用 GenericWidget.Tapped。如果此小部件设置了“OnLeftClickp”的函数指针,请调用它。至关重要的是,当发生这种情况时,我们会传递一个指向小部件本身的指针,因为我编写的所有事件处理程序都需要访问 *About 以及我添加到 GenericWidget 的任何其他内容。

创建很简单:

当需要创建标签时,我会这样做并将其折叠成 GenericWidget

所有这些 GenericWidget 都可以正常工作——我将它们添加到适当的 Box 中,然后按我的预期绘制窗口。我可以右键单击标签,如果设置了 OnRightClickp,通常是这样,代码被调用并被授予对 *GenericWidget 的访问权限,这导致 *About,这意味着被放置的菜单可以提供所有正确的东西这个标签里有什么。

当然,Labels 通常不关心点击,所以我窃取了 Tappable 中的所有调用这一事实并不重要。

但是 Select 小部件确实关心左键单击,因此 GenericWidget 正在拦截对 Tapped() 的调用这一事实意味着我永远不会看到下拉菜单出现。

没问题,我想。当我创建 Select 小部件和周围的 GenericWidget 时,我只需指定我想自己调用 Select 的 Tapped:

编译正常,显示选择,但是当我左键单击时,它会打印预期的“选择点击”,然后立即恐慌:

我迷路了。我的 GenericWidget 只是一个小部件;我认为这就是组合所做的,并且我创建的所有 GenericWidgets 都放在一个 Box 中,该 Box 位于窗口中的 SetContent 中。但是该错误向我暗示,不知何故,此 Select 对象设置不正确,并且在绘制选项时,缺少某些东西。我做错了什么?

有可能我的整个方法都是错误的(我做了很多 C++ 和 Python,我对事物采取了 OO 的观点)。在那种情况下,我该怎么做?

0 投票
1 回答
863 浏览

go - 未能扩展 fyne 的小部件

(这里有很多新细节。)

我正在尝试(非常努力地)扩展 Fyne 的一些小部件的功能。基本上我需要实现或“覆盖”右键单击选择、按钮、编辑等内容。我还需要对其他一些行为进行细微更改。

我尝试以各种方式扩展现有的小部件。我所做的一切都会导致编译失败、恐慌或奇怪和不正确的行为。下面的答案提供了 Button 解决方案的声明,但它并不完整。当我将相同的技术应用于 Select 时,尝试左键单击时会出现恐慌。

恐慌是

回想起来,这是我最初失败的地方,也是促使我尝试越来越复杂的方法的原因,但都没有奏效。Button 和 Select 显然有不同的要求。

(很抱歉“不接受”,但另一种选择是数小时的尝试,并且不相信我所尝试的 - 即使它避免了恐慌 - 是正确的长期解决方案。声称 Fyne 小部件是可扩展的 - 似乎合理地要求改进文档以显示如何,因为幼稚的尝试并不统一。)

在这里,我尝试使用答案中的技术扩展我关心的小部件。我原以为所有这些小部件都会以相同的方式运行,以覆盖 TappedSecondary 为模。他们一般不会。正确的答案显然比下面的答案复杂得多。这是我根据下面给出的代码的发现:

扩展按钮(如答案所示):当鼠标进入该区域时,widget.Button会改变颜色。扩展版没有。单击时,这两种形式都不会改变按钮的外观(我通常希望任何 GUI 都会出现这种情况,也许还缺少其他东西?)扩展版本确实捕获了 TappedSecondary。

扩展选择(如上所示):左键单击恐慌。右键单击被正确捕获。

扩展标签:您必须添加一个无操作的 Tapped 功能以使其与所需的界面相匹配,但是可以捕获右键单击,一切看起来都很好。

扩展条目:它捕获了 TappedSecondary,正如预期的那样,这意味着我没有得到通常的下拉菜单。左键单击(移动光标)不会在新位置重绘光标,但内部光标位置会发生变化(退格会删除新位置的字符,然后正确重绘所有内容)。

扩展检查: TappedSecondary 被捕获。左键单击会导致调用 OnChanged(并且每次正确传递的布尔值都会交替)但从未绘制复选标记。

据我今天所知,这些是我需要扩展的唯一小部件,所以当它使列出的小部件像往常一样工作时,我认为答案是完整的,除了我得到 TappedSecondary。理想的答案是指向在线某个地方的新文档,该文档以保留现有行为的方式为所有小部件类型提供了完整的示例(除非您故意覆盖该行为。)

总体印象:以最简单的方式扩展小部件可能会改变或破坏小部件在响应鼠标事件时绘制的某些方面,包括来自 Select 的恐慌和缺少 Entry、Button 和 Check 中的图形更改。我没有覆盖任何现有的 Tapped() 函数,所以我不知道为什么会这样。

0 投票
1 回答
285 浏览

go - fyne 的线程安全定义在哪里?

线程安全的承诺让我被 Fyne(以及 Go)所吸引。但是现在我在阅读 Go 方面变得更好了,我看到一些事情让人相信 API 作为一个整体不是线程安全的,也许从来没有打算这样做。所以我试图确定 Fyne 中“线程安全”的含义。

我专门看

并注意到 l.Text 也是一个字符串。Go 中的赋值不是线程安全的,所以对我来说很明显,如果两个线程争夺标签的文本并且同时调用 label.SetText,我可以预料到内存损坏。

“但你不会那样做”,有人可能会说。不,但我担心有人编辑条目的内容,而应用程序线程决定它需要替换所有条目的文本 - 这在我的应用程序中是完全可能的,因为它支持多个用户通过网络同时编辑,所以各种小部件的更新都是异步的。(注意我不关心如果两个人同时编辑同一个条目会发生什么;某人的更改将会丢失,我不在乎谁是。但它一定不会导致内存损坏。)请注意,我可以使用一种方法采取的做法是让后台线程创建一个全新的 Entry 小部件,然后替换当前 Box 中的那个。但是那个线程安全吗?

并不是我不知道如何用通道序列化事物。但我希望 Fyne 会消除对它的需求(一篇博客文章声称它确实如此);即使使用通道,我也无法说服自己,当某个后台线程正在更改、隐藏它等时,用户以各种方式干预小部件不会导致崩溃。也许所有这些都在幕后序列化并且非常安全,但我不想找出它不是的困难方式,因为我无法修复它。

Fyne 显然是相当新的并且似乎有很多承诺,但文档似乎对细节很轻。是否有更多信息可以在某处获得?人们有没有成功地尝试过这个?