2017-12-14 10 views
0

파이썬/Tkinter 프로그램이 있고 tk.Entry 상자에 사용 된 변수의 끝에있는 숫자를 증가 시키려고합니다. 예를 들어, self.output0, self.output1, self.output2를 들어결과 [0]의 숫자를 늘리는 방법은 무엇입니까?

는 등

는 (죄송합니다, 내 코드는 내가 예를 들어 그것을 단축 시도 너무 깁니다.)

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) 

I '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 행 데이터베이스에서 상기 출력 할 것이다.

코드를 짧게하고 싶습니다. 어떻게 아래 타고 나는 내가 outputX 결과의 수를 증가 할

  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.") 

이 어떻게 증가 할 수 있습니다 "resuls [X]"의 숫자 나는 SQL 쿼리에서 다른 행을 얻을 수 있도록? 각 행에 동일한 행을 인쇄합니다.

답변

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 코드를 모두 제거하고 당신이 당신의 데이터베이스에서 얻을 같은 형식으로 일부 하드 코딩 된 데이터로 대체 할 수 있다면 그것은 가장 좋은 것입니다 . –