2017-08-29 49 views
0

當我使用PyQt5創建GUI在這GUI我想象Bokeh圖使用QWebEngineViewQWebEngineView:「不能讀取屬性‘pageX屬性’的未定義」靜音背景虛化的傳說

它工作正常,但是當我試圖推行「靜音」像this傳說我得到一個錯誤:如果我用show方法

js: Uncaught TypeError: Cannot read property 'pageX' of undefined 

,我得到了我的瀏覽器的預期結果。但是,如果我使用保存並將其顯示到QWebEngineView我收到提到的錯誤。

任何想法?

Gui類插槽繪製,並顯示在QWebEngineView

注:忽略酒吧和比薩餅情節,它是分散的,併線,是有關此事

def plotGraph(self, df=None): 
    # Get parameters to plot 
    x = str(self.ui.comboBox_x_axis.currentText()) 
    y = str(self.ui.comboBox_y_axis.currentText()) 
    # Define axis types 
    try: 
     x_axis_type = str(
      self.ui.comboBox_plot_scale.currentText()).split('-')[0] 
     y_axis_type = str(
      self.ui.comboBox_plot_scale.currentText()).split('-')[1] 
    except: 
     x_axis_type = 'auto' 
     y_axis_type = 'auto' 
    # Define kind of graph 
    kind = str(self.ui.comboBox_plot_style.currentText()) 
    # For bar chart define groups 
    group = str(self.ui.comboBox_group.currentText()) 
    # Prepare data for plot 
    if (kind == 'bar' and group != "Don't group"): 
     data = df[[x, y, group]] 
    else: 
     data = df[[x, y]] 
     data = data.sort_values(x, axis=0) 
    # Dynamically define plot size 
    width = round(self.ui.webViewer.frameGeometry().width()) 
    height = round(self.ui.webViewer.frameGeometry().height()) 
    # Plot and save html 
    self.plot = self.graph.plot(
     data, kind, x_axis_type, y_axis_type, width, height) 
    self.plot_num = 1 
    # Display it at QWebEngineView 
    self.ui.webViewer.setUrl(QtCore.QUrl(
     "file:///C:/Users/eandrade_brp/Documents/git/tl-data-viewer/plot.html")) 

這裏是處理所有的背景虛化生成的圖表類(我省略了一些非必要的代碼)

class Graph(object): 
    """docstring for ClassName""" 

    def __init__(self, file_name="plot.html"): 
     super(Graph, self).__init__() 
     output_file(file_name) 

    def plot(self, data, kind, x_axis_type, y_axis_type, width, height): 
     p = None 
     if kind == 'scatter' or kind == 'line': 
      layout, p = self.createFigure(
       data, kind, x_axis_type, y_axis_type, width, height) 
     elif kind == 'bar': 
      layout = self.plot_Bar(data, width, height) 
     elif kind == 'pizza': 
      layout = self.plot_Pizza(
       data, width, height) 
     # Show/save 
     save(layout) 
     return p 

    def createFigure(self, data, kind, x_axis_type, y_axis_type, width, height): 
     source, xdata, ydata, xvalues, yvalues = self.prepare_data(data) 
     # Define tool 
     tools = "pan, box_zoom, lasso_select, undo, redo" 
     wheel_zoom = WheelZoomTool() 
     hover = HoverTool(
      tooltips=[ 
       (data.columns[0],   '$x'), 
       (data.columns[1],   '$y')], 
      mode='mouse') 
     # Create first figure and customize 
     fig1 = figure(title="{} vs {}" .format(ydata, xdata), tools=tools, 
         x_axis_type=x_axis_type, y_axis_type=y_axis_type, 
         toolbar_location="right", plot_width=round(0.9 * width), 
         plot_height=round(0.75 * height)) 
     fig1.add_tools(wheel_zoom) 
     fig1.add_tools(hover) 
     fig1.toolbar.active_scroll = wheel_zoom 
     fig1.background_fill_color = "beige" 
     fig1.background_fill_alpha = 0.4 

     # Create second figure and customize 
     fig2 = figure(title='Overview', title_location="left", 
         x_axis_type=x_axis_type, y_axis_type=y_axis_type, 
         tools='', plot_width=round(0.9 * width), plot_height=round(0.25 * height)) 
     fig2.xaxis.major_tick_line_color = None 
     fig2.xaxis.minor_tick_line_color = None 
     fig2.yaxis.major_tick_line_color = None 
     fig2.yaxis.minor_tick_line_color = None 
     fig2.xaxis.major_label_text_color = None 
     fig2.yaxis.major_label_text_color = None 

     # Add View box to second figure 
     rect = Rect(x='x', y='y', width='width', height='height', fill_alpha=0.1, 
        line_color='black', fill_color='black') 
     fig2.add_glyph(source, rect) 

     # Add JS callBacks 
     self.JS_linkPlots(fig1, source) 

     # Plots 
     plots = self.plot_continuous(source, xvalues, yvalues, fig1, kind) 
     self.plot_continuous(source, xvalues, yvalues, fig2, kind) 
     s2 = ColumnDataSource(data=dict(ym=[0.5, 0.5])) 
     fig1.line(x=[0, 1], y='ym', color="orange", 
        line_width=5, alpha=0.6, source=s2) 

     # Add legends 
     legend = Legend(items=[ 
      (ydata, plots)], 
      location=(0, 0), 
      click_policy="mute") 
     # Add legend to fig layout 
     fig1.add_layout(legend, 'below') 
     # Layout 
     layout = col(fig1, fig2) 
     return layout, fig1 

    def plot_continuous(self, source, xvalues, yvalues, fig, kind, color=0): 
     if kind == 'scatter': 
      s = fig.scatter(
       xvalues, yvalues, 
       fill_color='white', fill_alpha=0.6, 
       line_color=Spectral10[color], size=8, 
       selection_color="firebrick", 
       nonselection_fill_alpha=0.2, 
       nonselection_fill_color="blue", 
       nonselection_line_color="firebrick", 
       nonselection_line_alpha=1.0) 
      return [s] 

     elif kind == 'line': 
      l = fig.line(
       xvalues, yvalues, line_width=2, color=Spectral10[color], alpha=0.8, 
       muted_color=Spectral10[color], muted_alpha=0.2) 

      s = fig.scatter(
       xvalues, yvalues, 
       fill_color="white", fill_alpha=0.6, 
       line_color=Spectral10[color], size=8, 
       selection_color="firebrick", 
       nonselection_fill_alpha=0.2, 
       nonselection_fill_color="blue", 
       nonselection_line_color="firebrick", 
       nonselection_line_alpha=1.0) 
      return [s, l] 
     else: 
      raise 'Wrong type of plot' 

    def prepare_data(self, data): 
     xdata = data.columns[0] 
     xvalues = data[xdata] 
     ydata = data.columns[1] 
     yvalues = data[ydata] 
     source = ColumnDataSource(data) 
     return source, xdata, ydata, xvalues, yvalues 

回答

1

首先,disclai mer: Bokeh沒有聲稱完全或部分地使用Qt瀏覽器小部件。我們根本沒有能力在持續測試中嚴格保持這一要求,因此我們無法做到。如果任何人願意介入作爲該功能的維護者,未來我們可以提出更強大的支持聲明。


背景虛化使用第三方庫Hammer.js提供統一的低級別事件在不同的平臺處理。 Bokeh期望生成的事件具有pageXpageY屬性。看起來Qt的瀏覽器小部件並不能滿足這個期望,導致了你所看到的錯誤。更新Bokeh使用的Hammer版本可能會解決問題。可能會引入解決方法。無論如何,這需要BokehJS本身的新工作。

簡短的回答是:這個互動傳說可能只是不會在Qt上工作。作爲一種解決方法,請使用Bokeh小部件或Qt小部件來顯示字形,並且不要依賴交互式圖例功能。

長期:我可以看看上面提出的一些想法。但是我們需要幫助才能做到。 我們沒有帶寬,能力或經驗來自己構建Qt應用程序來測試潛在的修補程序。如果您有能力與核心開發人員一起尋找解決方案,請隨時在issue tracker上提出問題。

相關問題