2013-07-20 123 views
0

所以,我用PyQt的Python,我有一個很奇怪的問題。在幾行代碼之後,在一個點上打印OK的字符串不會打印OK!這裏是我的代碼:Python和PyQt字符串不能打印

name = str(self.lineEdit.text().toUtf8()) 
     self.let_change = Search() 
     name_no_ind = self.let_change.indentation(name) 
     print(name_no_ind) 
     name_cap = self.let_change.capital(name) 
     name_low = self.let_change.lower(name) 
     print(name_no_ind, name_cap, name_low) 
     col = self.combobox.currentIndex() 
     row = 0 
     for i in range(0, self.tableWidget.rowCount()): 
      try: 
       find_no_ind = self.let_change.indentation(self.tableWidget.item(row, col).text()) 
       find_cap = self.let_change.capital(self.tableWidget.item(row, col).text()) 
       find_lower = self.let_change.lower(self.tableWidget.item(row, col).text()) 
       if name_no_ind or name_cap or name_low in find_no_ind or find_cap or find_lower: 
        self.tableWidget.setItemSelected(self.tableWidget.item(row, col), True) 
        print("Item found in %d, %d" % (row,col)) 
       row += 1 
      except AttributeError: 
       row += 1 

這裏就是我得到:

Αντωνης 
('\xce\x91\xce\xbd\xcf\x84\xcf\x89\xce\xbd\xce\xb7\xcf\x82', '\xce\x91\xce\x9d\xce\xa4\xcf\x8e\xce\x9d\xce\x97\xce\xa3', '\xce\xb1\xce\xbd\xcf\x84\xcf\x8e\xce\xbd\xce\xb7\xcf\x82') 
Item found in 0, 0 

是不是很奇怪嗎?它打印確定,然後它不。有人知道我能做什麼嗎?

PS:這裏的功能是:

# -*- coding: utf-8 -*- 
class Search(): 
    #A function that removes indentations: 
    def indentation(self, name): 
     a = name 
     b = ["ά", "Ά", "ή", "Ή", "ώ", "Ώ", "έ", "Έ", "ύ", "Ύ", "ί", "Ί", "ό", "Ό"] 
     c = ['α', 'Α', 'η', 'Η', 'ω', 'Ω', 'ε', 'Ε', 'υ', 'Υ', 'ι', 'Ι', 'ο', 'Ο'] 
     for i in b: 
      a = a.replace(i, c[b.index(i)]) 
     return a 

    # A function that makes letters capital:  
    def capital(self, name): 
     a = name 
     greek_small = ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "ς"] 
     greek_capital = ["Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω", "Σ"] 
     for i in greek_small: 
      a = a.replace(i, greek_capital[greek_small.index(i)]) 
     return a 
    #A function that makes letters lower:  
    def lower(self, name): 
     a = name 
     greek_small = ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "ς"] 
     greek_capital = ["Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω", "Σ"] 
     for i in greek_capital: 
      a = a.replace(i, greek_small[greek_capital.index(i)]) 
     return a 

基本上,它利用或降低希臘字符...

SOLUTION !!!: 史蒂夫解決最初的問題,並基於什麼他說,我想出了這一點,解決一切問題:

name = str(self.lineEdit.text().toUtf8()) 
     self.let_change = Search() 
     name_no_ind = self.let_change.indentation(name) 
     name_cap = self.let_change.capital(name) 
     name_low = self.let_change.lower(name) 
     name_list = [name, name_no_ind, name_cap, name_low] 
     col = self.combobox.currentIndex() 
     row = 0 
     for i in range(0, self.tableWidget.rowCount()): 
      try: 
       item_ = str(self.tableWidget.item(row, col).text().toUtf8()) 
       find_no_ind = self.let_change.indentation(item_) 
       find_cap = self.let_change.capital(item_) 
       find_lower = self.let_change.lower(item_) 
       item_list = [find_no_ind, find_cap, find_lower] 
       for x in name_list: 
        for y in item_list: 
         if x in y: 
          self.tableWidget.setItemSelected(self.tableWidget.item(row, col), True) 
       row += 1 
      except AttributeError: 
       row += 1 

回答

1

我要說的是,一個R兩個self.let_change.capital(name)self.let_change.lower(name)正在使用輸入參數的名稱或可能更改編碼來覆蓋它。既然你還沒有發佈他們的代碼,我不能確定。

對不起,他們不是問題。問題在於你以不同的方式打印它們:

>>> print(capital(name)) 
ΑΝΤΩΝΗΣ 
>>> print(capital(name), name) 
('\xce\x91\xce\x9d\xce\xa4\xce\xa9\xce\x9d\xce\x97\xce\xa3', '\xce\x91\xce\xbd\xcf\x84\xcf\x89\xce\xbd\xce\xb7\xcf\x82') 
>>> print(capital(name)) 
ΑΝΤΩΝΗΣ 
>>> print(name, name) 
('\xce\x91\xce\xbd\xcf\x84\xcf\x89\xce\xbd\xce\xb7\xcf\x82', '\xce\x91\xce\xbd\xcf\x84\xcf\x89\xce\xbd\xce\xb7\xcf\x82') 
>>> print(name,) 
('\xce\x91\xce\xbd\xcf\x84\xcf\x89\xce\xbd\xce\xb7\xcf\x82',) 
>>> print(name) 
Αντωνης 
>>> print("%s = %s" % (name, capital(name))) 
Αντωνης = ΑΝΤΩΝΗΣ 
>>> 

因此,您需要單獨的打印語句或使用格式字符串。

+0

對不起,我現在加了它... – Antoni4040

+0

你說的對,但那不是唯一的問題:在那之後,(在長時間的序列中或者在)或者它沒有做它需要的工作做,它不會選擇只有在他們的字符串的項目,它會選擇所有的項目!我希望你明白我想說的是什麼,我懷疑我是否正確地解釋了...... – Antoni4040

+0

基本上擺脫了or或者 - 沒有括號就是壞消息 - 只要從單元格獲取值(如val說),使用strip來擺脫任何前導空格,檢查if(self.greek_capitials中的val [0])或(self.greek_lower中的val [0]) - 我將它們移到對象級別以避免出現一個空格複製每個功能 - 只有當你知道有一個字符串,你應該開始處理它作爲一個字符串。順便說一句,這是一個單獨的問題,如果沒有整理出來,應該作爲一個新問題提出來。 –