2016-11-11 193 views
0

我使用Kivy示例代碼從兩個不同的文件獲取文件路徑。 我的目標是使用文件路徑打開和處理文件中的數據。kivy - 按鈕執行功能

我的問題是將文件路徑傳遞到下面測試函數中的打開文件命令。

這裏是我的代碼:

from kivy.app import App  
from kivy.uix.button import Button  
from kivy.core.window import Window  
from kivy.uix.boxlayout import BoxLayout  
from kivy.uix.label import Label  

import re  
import pandas as pd 

class DropFile(Button): 

     def __init__(self, **kwargs): 
      super(DropFile, self).__init__(**kwargs) 
      # get app instance to add function from widget 
      app = App.get_running_app() 
      # add function to the list 
      app.drops.append(self.on_dropfile) 

     def on_dropfile(self, widget, path): 
      # a function catching a dropped file 
      # if it's dropped in the widget's area 
      if self.collide_point(*Window.mouse_pos): 
       self.text = path 

     def test(self): 
      minimum_wage = open(**FILE PATH HERE**) 
      LinesToString = '' 
      for line in minimum_wage: 
       LinesToString += line 
      patFinder = re.compile('\d{5}\s+\d{5,9}') 
      findPat = re.findall(patFinder, LinesToString) 
      empno_list = [] 
      pattern = '(\d{5})\s+(\d{5})' 
      for string in findPat: 
       match = re.search(pattern, string) 
       empno = match.group(2) 
       empno_list.append(empno) 
      MinimumWage = pd.DataFrame({'EMPNO': empno_list}) 
      MinimumWage.set_index('EMPNO') 
      print MinimumWage.head() 
      print MinimumWage.shape 

class DropApp(App): 

     def build(self): 
      # set an empty list that will be later populated 
      # with functions from widgets themselves 
      self.drops = [] 
      # bind handling function to 'on_dropfile' 
      Window.bind(on_dropfile=self.handledrops) 
      box = BoxLayout(orientation='vertical') 
      top_label = Label(text='Data manipulation', font_size=45) 
      box.add_widget(top_label) 

      run_button = Button(text='Run', size_hint=(1, 0.5)) 
      run_button.bind(on_press=DropFile.test) 
      box.add_widget(run_button) 

      two_buttons = BoxLayout(orientation='horizontal') 
      dropleft = DropFile(text='Drag & Drop File here') 
      # dropright = DropFile(text='right') 
      two_buttons.add_widget(dropleft) 
      # two_buttons.add_widget(dropright) 
      box.add_widget(two_buttons) 
      return box 

     def handledrops(self, *args): 
      # this will execute each function from list with arguments from 
      # Window.on_dropfile 
      # 
      # make sure `Window.on_dropfile` works on your system first, 
      # otherwise the example won't work at all 
      for func in self.drops: 
       func(*args) 

DropApp().run() 

感謝

+0

您的縮進被打破。 –

+0

該死的即時通訊設法修復它,但它只是不斷打破縮進 – MaxKedem

+0

@MaxKedem複製代碼在這裏,選擇它,按Ctrl + K – KeyWeeUsr

回答

0

您可以在on_dropfile()如最後一行調用test()方法:

def on_dropfile(self, widget, path): 
    # a function catching a dropped file 
    # if it's dropped in the widget's area 
    if self.collide_point(*Window.mouse_pos): 
     self.text = path 
     self.test(path) 

def test(self, path): 
    minimum_wage = open(path) 
    LinesToString = '' 
    ... 

或從現有的東西已經推出例如如果從on_dropfile()功能單獨運行test()和更改文本後,你將不會改變self.text屬性:

def on_dropfile(self, widget, path): 
    # a function catching a dropped file 
    # if it's dropped in the widget's area 
    if self.collide_point(*Window.mouse_pos): 
     self.text = path # path is assigned to self.text <-- 

def test(self): 
    minimum_wage = open(self.text) # <-- and you can use it 
    LinesToString = '' 
    ... 

或者在on_dropfile末放入一個單獨的變量和使用,在open()

+0

謝謝你回答我的KeyWeeUsr,但仍然當我點擊「運行」按鈕應用程序粉碎... TypeError:測試()只需要2個參數(1給出)...有任何想法爲什麼? – MaxKedem

+0

@MaxKedem你知道這裏有一個關於Q&A如何在這裏工作的[faq](http://stackoverflow.com/tour),對吧? :P – KeyWeeUsr