2017-12-14 11 views
0

私はPython/Tkinterプログラムを持っていて、tk.Entryボックスに使用される変数の最後にいくつかの数字を増やそうとしています。結果[0]の数を増やす方法は?

例えば

、self.output0、self.output1、self.output2など

(申し訳ありませんが、私のコードが長いので、私は、例えばそれを短縮しようとしたである。)

self.entries = [] 
    self.output0 = tk.Entry(self, width=149, justify='center', bd='0', bg='#E0E0E0') 
    self.output0.grid(column=0, row=6, columnspan=5, padx=1) 

    self.output1 = tk.Entry(self, width=149, justify='center', bd='0', bg='#E0E0E0') 
    self.output1.grid(column=0, row=7, columnspan=5, padx=1) 

私は'self.first_entry'のような別の入力ボックスでユーザー入力を取得し、ユーザー入力に対してSQL照会を実行します。例えば

class Adder(ttk.Frame): 
    """The adders gui and functions.""" 
    def __init__(self, parent, *args, **kwargs): 
     ttk.Frame.__init__(self, parent, *args, **kwargs) 
     self.root = parent 
     self.init_gui() 

    def authenticate(self): 
     return pypyodbc.connect('Driver={SQL Server};Server=MYSERVERNAME;Database=MYDATABASENAME;Trusted_Connection=yes;') 

    def calculate(self): 
     firstname = str(self.first_entry.get()) # converts user entry into variable 
     lastname = str(self.last_entry.get())  
     license = str(self.lic_entry.get()) 

     try: 
      connection = self.authenticate() 
     except pypyodbc.Error as ex: 
      sqlstate = ex.args[0] 
      if sqlstate == '28000': 
       self.output0.delete(0, END) 
       self.output0.insert(0,"You do not have access.") 
     cursor = connection.cursor() 
     if (firstname and not lastname and not license): # "You entered first name." 
      SQLCommand = ("SELECT LASTNAME, FIRSTNAME, LICNUMBER "  
       "FROM MyTABLEName " # table name 
       "with (nolock)" 
       "WHERE FIRSTNAME LIKE ?") 
      Values = [firstname + '%'] 
     else: 
      SQLCommand = ("SELECT LASTNAME, FIRSTNAME, LICNUMBER "  
       "FROM MyTABLEName " # table name 
       "(nolock)" 
       "WHERE FIRSTNAME LIKE ? AND LASTNAME LIKE ? AND LICNUMBER LIKE ?") 
      Values = [firstname + '%', lastname + '%', '%' + license + '%'] 
     cursor.execute(SQLCommand,Values) 
     results = cursor.fetchmany(10) 
     if results: 
      self.output0.delete(0, END) # clears entry 
      self.output0.insert(0,results[0]) # enters results in entry 
      self.output1.delete(0, END) # clears entry 
      self.output1.insert(0,results[1]) # enters results in entry 
      self.output2.delete(0, END) # clears entry 
      self.output2.insert(0,results[2]) # enters results in entry 
      self.output3.delete(0, END) # clears entry 
      self.output3.insert(0,results[3]) # enters results in entry 
      self.output4.delete(0, END) # clears entry 
      self.output4.insert(0,results[4]) # enters results in entry 
      connection.close() 
     else: 
      self.output0.delete(0, END) 
      self.output0.insert(0,"There are no records for this input.") 

上記意志出力データベースから5行。

私はコードを短くしたいです。どのように私は、下記取ると、私は結果に出力xと番号をインクリメントしたい

  self.output0.delete(0, END) # clears entry 
      self.output0.insert(0,results[0]) # enters results in entry 
      self.output1.delete(0, END) # clears entry 
      self.output1.insert(0,results[1]) # enters results in entry 
      2 
      2 
      3 
      3 
      ...etc 

を繰り返す必要がないようにそれを書くことができます[x]の

下記これは私がしようとしているものです動作していない:

cursor.execute(SQLCommand,Values) 
    results = cursor.fetchmany(10) 
    self.outputs = [self.output0, self.output1, self.output2, self.output3, self.output4] 
    for output in self.outputs: 
     for i in range(0, 4): 
      if results: 
       output.delete(0, END) # clears entry 
       output.insert(0,results[i]) # enters results in entry 
      else: 
       self.output0.delete(0, END) 
       self.output0.insert(0,"There are no records for this input.") 

私はSQLクエリから別の行を取得するように、私は「resuls [X]」の数をインクリメントするにはどうすればよいですか?各行に同じ行を印刷し続けます。

答えて

0

問題は、カーソルのインデックスを作成しようとしていることです。最初にリストに変換してから、関数を実行してみてください。

results = list(cursor.fetchmany(10)) 
0

一つとても邪魔に簡単ではない解決策をgetattr使用することです:

def update_fields(self, prefix, values): 
    for x, _ in enumerate(values): 
     attr = getattr(self, prefix + str(x)) 
     attr.delete(0, END) 
     attr.insert(0, values[x]) 

をそしてあなただけの思い:

results = cursor.fetchmany(10) 
if results: 
    self.update_fields('output', results) 

getattrAttributeError場合が発生しますのでご注意くださいselfには、outputXという名前の宣言フィールドがありません。

あなたは、例外を飲み込むことで宣言されていないフィールドを無視することができます。

def update_fields(self, prefix, values): 
    for x, _ in enumerate(values): 
     try: 
      attr = getattr(self, prefix + str(x)) 
      attr.delete(0, END) 
      attr.insert(0, values[x]) 
     except AttributeError: 
      pass 
      # You can also use continue 
+0

あなたはSQLコードのすべてを削除し、あなたがあなたのデータベースから取得する同じ形式でいくつかのハードコーディングされたデータに置き換えることができれば最高だろう。 –

関連する問題