2015-11-07 20 views

回答

0

您的代碼需要重新安排才能正常工作。要考慮的主要問題是把工作分成幾部分,每個部分都要做一件事。所以一個方法讀取文件,一個統計的話,一個輸出結果等

這裏就是你們的榜樣與一些意見,其中的變化已經取得了基本的重新寫入:

import sys, os, string 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

# move wordcount function into the class 

class Form(QDialog): 

    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 
     self.setWindowTitle("Word Count GUI") 
     # use placeholder text 
     self.lineedit2 = QLineEdit() 
     self.lineedit2.setPlaceholderText('Enter Filename Here') 
     self.pbutton2 = QPushButton('Press to Load File') 
     # use placeholder text 
     self.lineedit1 = QLineEdit() 
     self.lineedit1.setPlaceholderText("Enter Word Here") 
     self.pbutton1 = QPushButton("Press for Count") 
     self.pbuttonQuit = QPushButton("Exit") 
     # don't forget the layout... 
     layout = QVBoxLayout() 
     layout.addWidget(self.lineedit2) 
     layout.addWidget(self.pbutton2) 
     layout.addWidget(self.lineedit1) 
     layout.addWidget(self.pbutton1) 
     layout.addWidget(self.pbuttonQuit) 
     self.setLayout(layout) 
     self.pbutton2.setFocus() 
     # use new-style connections 
     self.pbutton1.clicked.connect(self.button1Pressed) 
     self.pbutton2.clicked.connect(self.button2Pressed) 
     # connect to self.close to quit 
     self.pbuttonQuit.clicked.connect(self.close) 
     # keep a list of lines 
     self.lines = [] 

    def wordcount(self, word): 
     total = 0 
     # iterate over stored lines 
     for line in self.lines: 
      line = line.translate(None, string.punctuation) 
      line = line.lower() 
      words = line.split() 
      if word in words: 
       total += 1 
     return total 

    def button1Pressed(self): 
     x1 = self.lineedit1.text() 
     x1 = str(x1).lower() 
     # use the wordcount method 
     x2 = self.wordcount(x1) 
     outtext = str(x1) + " appears " + str(x2) + " times in the file." 
     self.lineedit1.setText(outtext) 

    def button2Pressed(self): 
     # this reads the file and stores the lines 
     g = str(self.lineedit2.text()) 
     g = os.path.join('/Users/xxx/Documents/Python', g) 
     try: 
      with open(g) as stream: 
       self.lines = stream.readlines() 
     except EnvironmentError as exception: 
      print('ERROR: could not read file:') 
      print(' : %s' % exception) 
      self.lines = [] 

app = QApplication(sys.argv) 
form = Form() 
form.show() 
app.exec_() 
+0

你可以解釋button2Pressed中的os.path.join嗎?我從來沒有遇到過這個。 另外,是否將文本存儲爲列表,在self.lines = []中,允許程序運行? button2Pressed中的self.lines = []覆蓋方法__init__中的self.lines = [],與wordcount方法中使用的/ new方法相同,對吧? – SepticReVo

+0

(1)Python文檔:[os.path.join](http://docs.python.org/2/library/os.path.html#os.path.join)。 (2)我在發佈之前完全測試了我的代碼,那麼爲什麼不運行它並查看會發生什麼?使用'self.lines'並且擁有類中的所有內容的關鍵是,所有的方法都可以訪問相同的數據。它還允許您在不重新加載的情況下在同一文件上運行多個字數。 – ekhumoro

+0

我確實測試了你的代碼,只是在尋找過程的確認。感謝os.path.join上的鏈接。 – SepticReVo

0

當然,你可以在同一個GUI中完成。如果要防止用戶在加載文件前點擊按鈕pbutton1,可以將其屬性disabled設置爲True,並在文件加載後啓用按鈕(例如,調用button2Pressed函數時)。我沒有看到你的代碼中的任何文件的加載指令,所以首先要做的,你會被保存在你的對象文件內容,所以在你button2Pressed你需要的東西,如:

with open(self.lineedit1.text(), 'r') as my_file: 
    self.file_content = my_file.readlines() 

現在,當你有你的文件加載你需要計數的話。 readlines將文件分割成單獨的線,所以你也必須執行一個循環計算所有的話,那麼在button1Pressed你可以寫例如:

self.word_counter = 0 
for line in self.file_content: 
    for word in line.split(' ') 
     if word == self.lineedit2.text(): 
      counter +=1 

注意上面的代碼只將您的線條變成文字上一個空格(' ')。如果您想要刪除逗號和其他符號,請考慮使用regex。我希望這會給你一個想法。乾杯!

+0

怎麼辦然後我採取button2Pressed並將其輸入到我的函數wordcount?在過去,我使用raw_input命名文件,然後將它連接到我的計算機上的指定文件路徑(請參閱上面代碼中的變量g和f)。我應該從頂部移動我定義的函數並將它們插入按鈕按鈕的函數中? – SepticReVo

相關問題