2017-05-13 10 views
2

나는 파이썬과 GTK + 3을 사용하여 응용 프로그램을 작성하고 ScrolledWindow 내에서 TreeView를 사용하여 표 형식으로 데이터를 표시합니다.드래그하여 스크롤 된 스크롤 (터치 스크린에서 손가락 시뮬레이트)

트롤링 된 창을 트리 뷰 행을 드래그하여 스크롤 할 수 있습니까? 우리가 (모바일) 터치 스크린에서하는 것처럼. 문서에

, ScrolledWindows는-운동 스크롤 속성을 가지고 있지만 :

  1. 난 그냥 그것을 시뮬레이션하기 위해 마우스를 사용하려면, 그것은
  2. 내가 터치 스크린이없는 사용하는 방법을 모르겠어요.

크로스 플랫폼이 될 필요가없는 해결책은 우분투에만 필요합니다.

감사합니다.

+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은 이미 대부분의 * 뷰 위젯에서 동적 스크롤링 기능을 내장하고 있습니다. (어느 버전에서 페도라 23이 이미 있었는지 확실하지 않음) –

답변

0

가능한 해결 방법은 button press eventbutton release event입니다. 이것은 위젯 (treeview)과 이벤트에서 전달됩니다. 이 이벤트에는 .x 및 .y 속성이 있으며 마우스를 움직이는 거리를 감지하는 데 사용할 수 있습니다. 이벤트 속성에 대한

워드 프로세서 다운 :(

업데이트 :. 난 당신이 질문을 정확하게 수행 button press eventbutton release eventmotion notify event하면에있을 가지고 관찰하는 방법을 알아 냈

. 트 리뷰이 gtk에서는 빌더를 사용

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> 
,691,363 (210)

.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