2017-05-13 19 views
2

私は、PythonとGTK + 3でアプリケーションを構築していて、ScrolledWindow内のTreeViewを使って表形式でデータを表示しています。ドラッグしてスクロールしたウィンドウのスクロール

スクロールしたウィンドウをツリービューの行をドラッグしてスクロールできるように設定できますか?私たちが(モバイル)タッチスクリーンで行うようなもの。マニュアルの

、ScrolledWindowsは、運動スクロール性質を持っていますが、:

  1. は、私はちょうどそれをシミュレートするために、マウスを使用したい、それが
  2. 私はタッチスクリーンを持っていない使用する方法がわかりません。

私はソリューションがクロスプラットフォームである必要はありません.Ubuntuのみで必要です。

ありがとうございます。

+0

これは答えではありませんが、私はあなたがPygtkが時代遅れになっていると思います。 [This](http://python-gtk-3-tutorial.readthedocs.io/en/latest/introduction.html)は、Gtk3とPythonの使い方に関するチュートリアルです。 – theGtknerd

+0

ありがとうございます。しかし、実際それは私が使用しているものです。ウィンドウの作成はまさにそのようなものです。インポートはgi.repositoryからです。だから私はすでに、gkt3を使用していると思います。 – Lee

+0

最新のGtk + -3.0は、ほとんどの*ビューウィジェットにキネティックスクロールを組み込んでいます。 (どのバージョンからFedora 23に既にあったかわからない) –

答えて

0

可能な解決策は、button press eventbutton release eventに接続することです。これはウィジェット(ツリービュー)とイベントで渡されます。このイベントには、マウスの移動距離を検出するために使用できる.xおよび.y属性があります。

イベントのドキュメントがダウン:(

アップデートで属性:。私はあなたが求めて正確に何をする方法を考え出し

button press eventを観察し、button release eventmotion notify eventは上にある必要はあり。ツリービューには、これはGtkのBuilderを使用している

glade.uiファイルのコード:。

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.18.3 --> 
<interface> 
    <requires lib="gtk+" version="3.0"/> 
    <object class="GtkListStore" id="liststore1"> 
    <columns> 
     <!-- column-name gchararray1 --> 
     <column type="gchararray"/> 
    </columns> 
    </object> 
    <object class="GtkWindow" id="window"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <property name="title" translatable="yes">window</property> 
    <property name="default_width">500</property> 
    <property name="default_height">400</property> 
    <signal name="destroy" handler="on_window_destroy" swapped="no"/> 
    <child> 
     <object class="GtkScrolledWindow" id="scrolledwindow1"> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="events"/> 
     <property name="shadow_type">in</property> 
     <child> 
      <object class="GtkTreeView" id="treeview1"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="events"/> 
      <property name="model">liststore1</property> 
      <signal name="button-press-event" handler="button_press_event" swapped="no"/> 
      <signal name="button-release-event" handler="button_release_event" swapped="no"/> 
      <signal name="motion-notify-event" handler="motion_notify_event" swapped="no"/> 
      <child internal-child="selection"> 
       <object class="GtkTreeSelection" id="treeview-selection1"/> 
      </child> 
      <child> 
       <object class="GtkTreeViewColumn" id="treeviewcolumn1"> 
       <property name="title" translatable="yes">column</property> 
       <child> 
        <object class="GtkCellRendererText" id="cellrenderertext1"/> 
        <attributes> 
        <attribute name="text">0</attribute> 
        </attributes> 
       </child> 
       </object> 
      </child> 
      </object> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

の.pyファイルのコード:

#!/usr/bin/python 

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, GdkPixbuf, Gdk 
import os, sys 

UI_FILE = "glade.ui" 

class GUI: 
    def __init__(self): 

     self.builder = Gtk.Builder() 
     self.builder.add_from_file(UI_FILE) 
     self.builder.connect_signals(self) 

     liststore = self.builder.get_object('liststore1') 
     for i in range (100): 
      liststore.append([str(i)]) 

     self.v_scroll = self.builder.get_object('scrolledwindow1').get_vadjustment() 
     self.mouse_down = False 
     self.previous_y = 0 
     self.previous_position = 0 
     window = self.builder.get_object('window') 
     window.show_all() 

    def button_press_event (self, treeview, event): 
     if event.button == 1: 
      self.mouse_down = True 
      self.previous_y = event.y 
      self.previous_position = self.v_scroll.get_value() 

    def button_release_event (self, treeview, event): 
     self.mouse_down = False 

    def motion_notify_event (self, scrolled_window, event): 
     if self.mouse_down == False: 
      return 
     current_y = event.y 
     y_movement = (self.previous_y - current_y) 
     scroll_position = (self.previous_position + y_movement) 
     self.v_scroll.set_value(scroll_position) 

    def on_window_destroy(self, window): 
     Gtk.main_quit() 

def main(): 
    app = GUI() 
    Gtk.main() 

if __name__ == "__main__": 
    sys.exit(main()) 

変数名は、彼らが何をかなりよく説明する必要があります。私が間違ったことを理解すれば、私を正してください。

+0

イベントをどこに接続すればよいですか?ツリービュー、スクロールされたウィンドウ、または何か他の? – Lee

+0

ツリービュー。申し訳ございません。 – theGtknerd

+0

私はそれをやる方法がわからないのですが、試してみます。ありがとうございました。 – Lee

関連する問題