2012-03-28 22 views
0

我想開發一個GUI應用程序,該應用程序允許我繪製燭臺條形圖,然後在繪圖上手動繪製線條。wxPython,PyQwt或C#用於繪製圖形並在繪圖上手動繪製線條

我在Linux上工作,所以更喜歡跨平臺的解決方案,或者至少在Linux上運行。我傾向於使用Python,過去曾使用C#(在Linux上使用mono)。我已經做了一些研究,似乎表明wxPython或PyQwt(與matplotlib一起使用)將是一條路。我要承認我偏向於Python,因爲我現有的很多腳本都在Python中。但是,C#有一個很好的GUI庫,如果它在這個實例中是更好的工具,那麼我會願意使用它而不是基於Python的解決方案。

應用程序的要求如下:

  1. 情節燭臺
  2. 顯示鼠標下的座標將光標移動約
  3. 滾動左/右
  4. 變焦劇情/ out
  5. 重新繪製窗口大小時的繪圖
  6. 更改繪製圖的粒度
  7. 手動繪製爲特定粒度在圖表上線(對於當前的粒度)
  8. 顯示/隱藏線在圖上
  9. 編程方式訪問手動繪製線
  10. 保存情節文件作爲圖像

由於wxPython中,PyQwt和C#(一般來說)是新的給我,我想知道:

  • 是實施日的最佳方法Ë上述要求
  • 代表最淺的學習曲線

呈現出準系統骨架讓我開始(使用wxPython中,PyQt的,pyQwt或C#)將是非常有益的一個片段。在wxPython中

+0

它可以在任何標準的圖形用戶界面庫中使用,我認爲它並不重要。他們通常提供類似的工具和界面。我最近使用了matplotlib,它可能會滿足您的所有需求。 – Fenikso 2012-03-28 10:30:18

回答

0

快速和簡單的例子:

import wx 
import math 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 

class Graph(wx.Panel): 
    def __init__(self, *args, **kwargs): 
     wx.Panel.__init__(self, *args, **kwargs) 
     self.figure = Figure() 
     self.canvas = FigureCanvas(self, -1, self.figure) 
     self.Bind(wx.EVT_SIZE, self.OnSize) 

    def OnSize(self, event): 
     size = self.GetSize() 
     self.canvas.SetSize(size) 

    def Draw(self): 
     self.figure.clear() 
     self.subplot = self.figure.add_subplot(111) 
     x = [a*(math.pi/50) for a in range(100)] 
     y = [self.f(a) for a in x] 
     self.subplot.plot(x, y) 
     self.canvas.draw() 

    def DrawCosine(self, e): 
     self.f = math.cos 
     self.Draw() 

    def DrawSine(self, e): 
     self.f = math.sin 
     self.Draw()   


class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.button1 = wx.Button(self.panel, label="Sine") 
     self.button2 = wx.Button(self.panel, label="Cosine") 
     self.graph = Graph(self.panel) 
     self.graph.DrawSine(None) 

     self.button1.Bind(wx.EVT_BUTTON, self.graph.DrawSine) 
     self.button2.Bind(wx.EVT_BUTTON, self.graph.DrawCosine) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer2 = wx.BoxSizer() 

     self.sizer.Add(self.graph, 1, wx.ALL | wx.EXPAND) 
     self.sizer2.Add(self.button1, 1, wx.ALL | wx.EXPAND) 
     self.sizer2.Add(self.button2, 1, wx.ALL | wx.EXPAND) 
     self.sizer.Add(self.sizer2, 0, wx.ALL | wx.EXPAND) 

     self.panel.SetSizerAndFit(self.sizer) 
     self.Show() 

app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 

但是根據您的要求,也許使用(或略微重新設計)pyplot將只是不夠好:

import wx 
import math 
from matplotlib import pyplot 

class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.button1 = wx.Button(self.panel, label="Sine") 
     self.button2 = wx.Button(self.panel, label="Cosine") 

     self.button1.Bind(wx.EVT_BUTTON, self.DrawSine) 
     self.button2.Bind(wx.EVT_BUTTON, self.DrawCosine) 

     self.sizer = wx.BoxSizer() 

     self.sizer.Add(self.button1) 
     self.sizer.Add(self.button2) 

     self.panel.SetSizerAndFit(self.sizer) 
     self.Show() 

    def Draw(self): 
     x = [a*(math.pi/50) for a in range(100)] 
     y = [self.f(a) for a in x] 
     pyplot.plot(x, y) 
     pyplot.grid(True, which='both', axis="both") 
     pyplot.show() 

    def DrawCosine(self, e): 
     self.f = math.cos 
     self.Draw() 

    def DrawSine(self, e): 
     self.f = math.sin 
     self.Draw() 

app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 
+0

感謝您的代碼。至少我已經知道從哪裏開始。我現在已經安裝了wxPython。現在有趣的開始...... :)順便說一句,當你點擊任何按鈕時,你的第二個片段中的代碼會產生一個SEGV。 – 2012-03-28 19:37:57

+0

奇怪,它在Windows XP上正常工作。你有什麼操作系統?你能找出哪條線導致崩潰? – Fenikso 2012-03-29 07:39:02

+0

操作系統:Windows-XP-5.1.2600-SP3,Python:2.7.1,wxPython:2.8.12.1,Matplotlib:1.1.0 – Fenikso 2012-03-29 07:40:42

0

wxPython的是多爲你更好目的。存在一個非常好的教程,其中涵蓋了大部分基礎知識here