正如我在上一个问题中所提到的,我试图在功能上做一些类似向导的东西.我已经选择了添加了sizer的单帧.我为每个希望用户看到的屏幕构建面板,将它们添加到框架的sizer中,然后.Hide()通过一个面板在面板之间切换,然后.ShowYourself()在下一个面板上调用自定义面板.显然,我希望按钮与用户在整个过程中保持同一位置.
我通过"后退"和"下一步"按钮将两个面板链接在一个无限循环中,这样你就可以看到发生了什么.第一个小组看起来很棒; tom10的代码在那个级别上工作,因为它避开了我最初的,过度花哨的尝试,边界各处飞行.然后第二个小组似乎缩小到最低限度.当我们返回第一个面板时,这里也发生了收缩.为什么它在第一个面板上看起来很好,但是在我返回后没有?.Fit()如果我不想要10像素乘10像素的灰色,为什么需要调用?如果有必要,为什么会.Fit()给出不一致的结果?
这个无限循环似乎是我对此经历的一个特征:我在面板上修复了布局,但却发现切换会破坏其他面板的布局.我解决了这个问题,通过使用sizer_h.Add(self.panel1, 0)而不是sizer_h.Add(self.panel1, 1, wx.EXPAND),现在我的布局再次关闭.
到目前为止,我的"解决方案"是为mastersizer.SetMinSize((475, 592))每个面板的主sizer 添加一个(在下面的代码中注释掉).这是一个肮脏的解决方案,因为1)我必须找到通过试验和错误工作的数字(宽度为-5像素,高度为-28像素).2)我不明白为什么潜在的问题仍然存在.
什么是正确的,非丑陋的解决方案?如果切换面板不是将所有面板同时添加到框架的大小调整器中,而是应该.Detach()从框架的大小调整器中将面板包含在内,然后.Add()将下一个面板连接到框架的大小调整器上?是否有一种.JustMakeThisFillThePanel()隐藏在wxWidgets和wxPython文档在线的错过的方法?
我显然在布局的心理模型中遗漏了一些东西.粘贴在下面的极简主义代码.

import wx
import sys
class My_App(wx.App):
def OnInit(self):
self.frame = My_Frame(None)
self.frame.Show()
self.SetTopWindow(self.frame)
return True
def OnExit(self):
print 'Dying ...'
class My_Frame(wx.Frame):
def __init__(self, image, parent=None,id=-1, title='Generic Title', pos=wx.DefaultPosition, style=wx.CAPTION | wx.STAY_ON_TOP):
size = (480, 620)
wx.Frame.__init__(self, parent, id, 'Program Title', pos, size, …Run Code Online (Sandbox Code Playgroud) 对于数字的指数部分,有没有办法用科学记数法打印少于3个位置?6.1格式不会影响指数,只会影响数字部分:
var=1.23e-9;
printf ("%e\n", var);
printf ("%6.1e\n", var);
Run Code Online (Sandbox Code Playgroud)
给
1.230000e-009
1.2e-009
Run Code Online (Sandbox Code Playgroud)
我也在wxWidgets中尝试过这种格式化字符串,但行为是一样的.
m_var->SetLabel(wxString::Format(wxT("%6.1e"),var));
Run Code Online (Sandbox Code Playgroud)
我想拥有的是1.2e-9.
我已经做了几年的控制台编程,现在是时候了解一下GUI的迷人世界.我在wxWidgets中涉猎过一点点; 编写了一个Hello World程序,稍微玩了一下,等等.
现在我是那些有"低级诅咒"的人之一:我不知道如何使用有效的东西 - 我想知道引擎盖下发生了什么,即使它很少或者没有实际价值.
所以我一直在阅读这个主题(例如这里),但我发现很难绕过所有不同的系统,工具包和他们做的事情.到目前为止,我已经发现了(如果我错了,请纠正我):
现在提出一些问题:坚持使用类UNIX系统:
对于奖金,也许是Windows操作系统呢?它是否遵循类似的结构,还是完全按照自己的方式进行?
我想以MS Paint的风格编写一个绘画程序.
为了在用户移动鼠标时在屏幕上绘画,我必须等待鼠标移动事件并在我收到鼠标时在屏幕上绘图.显然,mose移动事件不经常发送,所以我必须通过在当前鼠标位置和前一个鼠标位置之间画一条线来插值鼠标移动.在伪代码中,这看起来像这样:
var positionOld = null
def handleMouseMove(positionNew):
if mouse.button.down:
if positionOld == null:
positionOld = positionNew
screen.draw.line(positionOld,positionNew)
positionOld = positionNew
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:使用直线段进行插值看起来太符合我的口味了,你能推荐一种更好的插值方法吗?GIMP或Adobe Photoshop采用什么方法?
或者,有没有办法增加我收到的鼠标移动事件的频率?我正在使用的GUI框架是wxWidgets.
GUI框架:wxWidgets.
(编程语言:Haskell,但这里不相关)
编辑:澄清:我想要看起来比直线段更平滑的东西,看图片(原始大小):
在鼠标位置之间绘制的锯齿状线条http://i26.tinypic.com/hwa42h.jpg
EDIT2:我使用的代码如下所示:
-- create bitmap and derive drawing context
im <- imageCreateSized (sy 800 600)
bitmap <- bitmapCreateFromImage im (-1) -- wxBitmap
dc <- memoryDCCreate -- wxMemoryDC
memoryDCSelectObject dc bitmap
...
-- handle mouse move
onMouse ... sw (MouseLeftDrag posNew _) = do
...
line dc …Run Code Online (Sandbox Code Playgroud) 在我的wxWidgets应用程序中,在调试模式下运行时,我在Visual Studio 2010的输出中收到了此消息.应用程序运行正常,我在关闭它之后才看到它.
检测到内存泄漏!
转储对象 - >
{9554}正常块位于0x003CDCC0,44个字节长.
数据:<end> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C CE 64 01{9553}正常块在0x003CDB58,长度为8个字节.
数据:<D e <> 44 BD 65 01 C0 DC 3C 00
{9552}正常块,位于0x003CDC50,48字节长.数据:<e> A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00
对象转储完成.
在我的程序中,我没有明确地分配内存,但是wxWidgets框架是.我第一次收到这样的消息,并且不知道它的确切原因.
我怎样才能摆脱这种内存泄漏?
我希望能够尽可能快速,轻松地构建GUI应用程序.我在C++中胜任(虽然不是专家,也没有正式的培训),但从未使用过GUI构建工具包或框架或任何东西.我不是一名专业程序员,在构建GUI应用程序时,我完全缺乏经验和无知.花了几个小时研究试图弄清楚要做什么; 但是,只会变得更加困惑和沮丧.
Qt和wxWidgets似乎是跨平台应用程序最受欢迎的选项,尽管跨平台对我来说不一定非常重要; 如果这意味着最快的学习曲线,那么仅限Windows就可以了.
Qt看起来很酷,Qt Creator看起来很漂亮,有很多很好的演示,除了它有自己的所有类,我不是太热衷于学习一堆只适用于Qt平台本身而不是更普遍的东西.我想我可以避免使用Qt类,除了我必须使用它们的GUI内容,但我不知道那将是多么明智或不明智.
我认为Visual Studio会有最小的学习曲线,但是当我打开一个测试GUI应用程序时,我看到一堆外国人看起来像克拉(^)的东西 - 我在网上发现这些意思是"句柄",我甚至无法理解定义或目的("有点像指针但不是真的"基本上是我读过人们如何定义它们).
我对wxWidgets几乎一无所知,或者它与Qt的比较.
因此,每个选项都有一个很大的学习曲线 - 理想情况下,我想知道哪个选项最大限度地减少了学习工具包/框架本身的时间.由于我可能永远不会从我创建的程序中赚钱,所以我花在学习特定工具包上的时间非常昂贵.我只是希望能够使用我拥有的C++知识制作一个功能程序,但是以GUI形式.目前似乎我想制作一个GUI应用程序,我不得不花费更多的时间来学习我使用的GUI框架,而不是编写应用程序本身的功能部分.
任何来自人更聪明,更有经验的投入都会受到赞赏:)
我在各种大小调整器中有几个按钮,它们以我想要的方式扩展.但是,当我将父项添加到用于在框架中的所有元素周围添加边框的新wx.BoxSizer时,已添加的sizer在垂直方向上正确运行,但不能水平运行.
以下代码演示了此问题:
#! /usr/bin/env python
import wx
import webbrowser
class App(wx.App):
def OnInit(self):
frame = MainFrame()
frame.Show()
self.SetTopWindow(frame)
return True
class MainFrame(wx.Frame):
title = 'Title'
def __init__(self):
wx.Frame.__init__(self, None, -1, self.title)
panel = wx.Panel(self)
#icon = wx.Icon('icon.png', wx.BITMAP_TYPE_PNG)
#self.SetIcon(icon)
sizer = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10)
button1 = wx.Button(panel, -1, 'BUTTON')
sizer.Add(button1, 0, wx.EXPAND)
buttonSizer = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=5)
buttonDelete = wx.Button(panel, -1, 'Delete')
buttonSizer.Add(buttonDelete, 0, 0)
buttonEdit = wx.Button(panel, -1, 'Edit')
buttonSizer.Add(buttonEdit, 0, 0)
buttonNew = wx.Button(panel, -1, 'New') …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习wxWidgets,但我仍然坚持一个我无法在文档中找到解释的地方.我想了解这个最小的wxWidgets程序:
#include <wx/wx.h>
class MyApp : public wxApp
{
virtual bool OnInit();
};
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
wxFrame *frame = new wxFrame(NULL, -1, _("Hello World"), wxPoint(50, 50),
wxSize(450, 350));
frame->Show(true);
return true;
}
Run Code Online (Sandbox Code Playgroud)
具体来说,为什么frame不泄漏?什么时候发布,谁的责任是?在一个普通的程序中,一个没有被传递给任何东西并且没有被删除而超出范围的指针几乎肯定是泄漏,但显然在wxWidgets中并非如此.
这是我得到的小部件的层次结构:
Frame> wxBoxSizer> wxPanel> wxBoxSizer> wxFlexGridSizer(2列,9行),里面有各种表单字段和按钮.
第一个BoxSizer是放置面板,第二个是围绕FlexGrid创建边框.
一切看起来都不错,如果窗口被放大,框架可以正常扩展,但它也可以调整到几乎没有,隐藏所有表单元素.
如何将窗口的最小大小强制为FlexGridSizer默认建议的大小(所有表单元素都可见且具有最小可能的大小)?