- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用reactive-banana 和reactive-banana-wx 包重新设计一个遗留的wxHaskell。然而,为了避免动态网络构建(我在 MVar 上遇到了线程 block ),我现在通过预构建一组固定的 wxHaskell 小部件来模仿这一点,我根据需要设置了这些小部件的可见性。可见性由采用Behavior
的sink
函数设置。然而,wxHaskell 要求在所有这些小部件通过sink
进行适当修改后,需要对包含这些小部件的面板的布局进行后续更改。这意味着 sink
-ing 实际上应该是网络的一部分,因此它是一个可以触发并等待布局更改的事件。目前,sink
会将您“带出”事件网络,因此在 sink
操作完成后不可能触发事件。我确实尝试将 sink
改编成这样:
sink' :: Frameworks t =>
w -> [Prop' t w] -> Moment t (Event t ())
sink' widget props = do
es <- mapM sink1 props
return $ unions es
where
sink1 (attr :== b) = do
x <- initial b
liftIOLater $ set widget [attr := x]
e <- changes b
return $ (\x -> unsafePerformIO $ set widget [attr := x]) <$> e
但是,unsafePerformIO
没有被执行。如何实现所需的行为,即允许通过 Event
等待 (wxHaskell) IO?
最佳答案
基本上,您似乎想要确保reactimate
中的IO操作按照一定的顺序执行?也就是说,您需要确保在设置小部件属性之后设置布局。
有几种方法可以指定顺序:
union
、unionWith
和/或 collect
确定同时事件的顺序。reactimate
按照它们在 Moment
monad 中出现的顺序执行。 (尽管严格来说,当您在动态事件切换中使用 observeE
组合器时,情况不再如此。)根据您的具体情况,可以按如下方式应用这些想法。
对于1,您可以创建一个包含IO操作的事件,然后将其与布局结合起来
sink' :: Frameworks t =>
w -> [Prop' t w] -> Moment t (Event t (IO ()))
sink' widget props = do
es <- mapM sink1 props
return $ foldr1 (unionWith (>>)) es
where
sink1 (attr :== b) = do
x <- initial b
liftIOLater $ set widget [attr := x]
e <- changes b
return $ (\x -> set widget [attr := x]) <$> e
对于 2,您可以简单地使用普通的 sink
函数,并确保布局是最后设置的。
do
sink widget1 [ visible :== bBool ]
sink window1 [ layout :== bLayout ]
monad 中 sink
函数的顺序保证了布局是最后设置的。
另请注意,自reactive-banana 0.7 起,您可以使用动态事件切换来对一组可变的小部件进行建模。请参阅BarTab.hs example进行演示。此示例还设置布局。
您表示在使用动态网络时遇到了 MVar block 。这可能是因为您创建小部件的方式会触发网络中的另一个事件。不幸的是,这在语义上是不合理的——它对应于取决于自身 future 版本的值——并且程序的响应是跌入谷底。
关于haskell - Reactor-banana-wx `sink` 不会生成启用后接收器处理的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13580121/
我是 Python 和 WX 的新手。我创建了一个简单的测试对话框,如下所示,用组合框提示用户。我想从我的主程序中的组合框中获取值。我如何从我的主程序中调用它? 这就是我打算调用它来显示对话框但当前不
我已经在框架内创建了 wx.Grid 小部件,如果用户正在使用网格小部件,我想更改光标类型。我已经成功地使用 wx.StockCursor 和 .SetCursor 方法 做到了这一点,但是如果用户将
我想知道如何从 wx 笔记本的一页到另一页获取变量。我在想,如果我知道变量名和页面 ID,应该有某种方法可以引用变量。例如,如果我有以下代码,我将如何从面板 y 引用变量 x,反之亦然 import
我需要使用 wx.Textvalidator 验证文本框。有什么可以帮我做这个吗? 我如何将 wx.FILTER_ALPHA 与验证器一起使用,如果用户输入错误,我该如何给他们消息? 我需要在点击保存
我的印象是面板更好。真的吗? 一个比另一个有什么优势?有什么理由使用一个而不是另一个? 最佳答案 wx.Window 是所有小部件的基类(不一定是所有 windows - 这个名字有误导性)。 wx.
我有一个 wx.ListCtrl 设置了 wx.LC_REPORT 位。它有 3 列。我希望在第一列中为每个其他条目填充一个复选框。我尝试使用 ListCtrl.InsertItem 方法,但它只需要
./configure 运行时返回错误消息: wx:无法链接wx驱动程序,wx将无法使用 当我运行.\configure | grep wx,日志如下: configure: configuring
你好,我想在静态框内绘制一些彩色线条,我使用了 onpaint 方法,但线条没有出现在静态框内,然后我尝试创建一条静态线,这有效但我无法更改静态线的颜色。有没有其他方法可以使用 onpaint 方法或
wx.PyControl 可以包含 wx.Sizer 吗? 请注意,我最终在这里尝试做的事情(具有浮点值的微调器)已经在另一个问题中得到了回答。我对在 wx.PyControl 中布局小部件特别感兴趣
派生类有一个小问题,即 wx.ListItem 和 wx.ListCtrl。我成功地将 wx.ListItem 派生为 MediaItem,代码还没有完成,但你明白了: class MediaItem
我正在用 wxPython 开发一个 GUI。我在另一个代表 CD 容器对象的正方形(也有 wxPanel 类)内绘制一个代表 CD 对象的正方形。我想在 CDWindow 的右键菜单中有“删除这张
使用 wx.lib.newevent.NewEvent() 和使用 wx.NewEventType() 和 wx.PyCommandEvent() 有什么区别?下面的代码示例使用两种不同的方式来创建事
我有一个 python 应用程序,我从 here 得到的并根据我的需要进行修改,但我想将我用于图标的图像放在脚本中,我知道可能存在性能问题但目前这不是问题,我需要的只是将所有文件放在一个文件中,这样我
我有一个 wx.Frame,其中有一个主 wx.Panel,里面有几个小部件。我想要那里的一个按钮导致出现“帮助面板”。这个帮助面板可能是一个 wx.Panel,我希望它覆盖整个主 wx.Panel(
我有一个关于如何在 (style = wx.LC_REPORT) 模式下使用 wx.ListCtrl 的教程,但我只使用一列: self.InsertColumn(0, "Item") 我怎样才能:
self.sizer.Add(self.listBox, proportion=0, flag=wx.TOP | wx.LEFT, border=75) BOTTOM 和 LEFT 的边框是 75,我
我想要一个 python 图形用户界面,它可以从文件中加载不同的图像。我见过许多使用以下代码加载图像的示例: img = wx.Image("1.jpg", wx.BITMAP_TYPE_ANY, -
背景:我正在编写一个模块来创建带有多个进度条(0-5)的自定义启动屏幕。初始屏幕可以以多种模式显示(全屏无帧、带/不带帧的屏幕百分比或带/不带帧的固定大小),并且可以容纳 0-5 个链接的进度表。进度
我刚刚在我的 mac 上安装了最新稳定版的 wxWidget,并尝试编译 hello world 教程中的代码。这是导致错误的代码: #include ' #ifndef WX_PRECOMP #in
当我编译我的项目时: ---------------------------------------------------------------------- wxFlasher configur
我是一名优秀的程序员,十分优秀!