2014-12-19 37 views
5

Bazı sorgu sonuçlarını görüntülemem gereken daha sıkı bir arayüzüm var ve kullanıcının bir sütunu değiştirip sonuçları gönderebilmesi için ihtiyacım var.SQL Sorgusu tkinter ile sonuçlanır

conn = connection_info_goes_here 
cur = conn.cursor() 
cur.execute(query_goes_here) 

Ve bu benim sorgu: Şu anda böyle bir şey yapıyorum sorguları çekmeye

SELECT id, reviewer, task, num_seconds, start_time, end_time 
FROM hours 
WHERE DATE(start_time) = '2014-12-18' 
AND reviewer = 'john' 

değiştirmek gereken kullanıcı alan num_seconds (sadece sayılar) 'dir. Sorum şu; sorgu sonuçlarını ızgarada nasıl gösterebilirim ve değişiklikleri göndermek için bir düğmeyle değiştirilebilir alanlardan birini nasıl yapabilirim?

Ek bilgi: Bunu zaten çok karışık bir şekilde exec() kullanarak yaptım ve her alan için programsal olarak değişkenler yaratıyorum. Çok uzun ve kafa karıştırıcı oldu ve gerçekten bunu yapmanın daha iyi ve daha kolay bir yolu olması gerektiğini düşünüyorum.

Herhangi bir yardım için teşekkür ederiz. Teşekkürler!!

Hızlı Güncelleme: bu beklemeye edilmiş olduğu için, ben ne arıyorum benzer bir şeyin bir görüntü ekleyeceğiz: değiştirmelisiniz

enter image description here

giriş etiket değerleri DB'ye geri yüklediğimde sütundaki değerler sağa.

def cor_window(): 
    corrections = Tk() 
    corrections.title("Corrections") 
    corrections_frame = ttk.Frame(corrections) 

    cor_values = [] 
    count=0 
    cor_count=0 
    for x in results: 
     count2=0 
     for y in results[count]: 

      if count2 == 3: 
       exec('int' + str(cor_count) + '=tkinter.StringVar') 
       exec('int' + str(cor_count) + '_entry = ttk.Entry(corrections, width=20, textvariable=int' + str(cor_count) + ')') 
       exec('int' + str(cor_count) + '_entry.grid(column=count2, row=count+2)') 

       cor_count = cor_count+1 
       cor_values.append('int' + str(cor_count) + '_entry') 

       ttk.Label(corrections, width=20, anchor=CENTER, relief=SUNKEN, borderwidth=1, text= results[count][count2]).grid(column=count2+1, row=count+2) 

      elif count2 > 3: 
       ttk.Label(corrections, width=20, anchor=CENTER, relief=SUNKEN, borderwidth=1, text= results[count][count2]).grid(column=count2+1, row=count+2) 
      else: 
       ttk.Label(corrections, width=20, anchor=CENTER, relief=SUNKEN, borderwidth=1, text= results[count][count2]).grid(column=count2, row=count+2) 
      count2=count2+1 
     count=count+1 

    ttk.Button(corrections, text="Done!", command=upload_cor).grid(column=0, row=1) 

results sorgu sonuçlarını içeren ve upload_cor olduğunu listesi: ben yaptım, çünkü ben dağınık bir şekilde bunu söylemek

(düşünebildiğim tek yolu) 'dir işlev değişiklikleri DB'ye yükleyecektir. Kullanıcı giriş kutusunu değiştirse bile, exec kullanıldığından, kullanıcının yazdığı şeyi almak için .get() kullanamıyorum. .get() kullanmayı denediğimde, giriş kutusuna bir şey yazılsa bile sadece None alırım.

Bunu yapmak için başka bir yönteme ihtiyacım var, yine, herhangi bir fikir kabul edilir.

+0

num_seconds bir Giriş (veya Giriş Kimlikleri listesi) kullanır ve gerisi Etiketler olur. Ayrıca, satır numarasını kayıtlara bağlamanız ve hangi satırların değiştiğini görmek için her girişi orijinal değerle karşılaştırmanız gerekir, ancak "id" benzersiz ise, o zaman basit olmalıdır.Giriş widget bilgisi http://effbot.org/tkinterbook/entry.htm –

cevap

7

Kesinlikle çalıştırmayı kullanmak istemezsiniz ve textvariable seçeneğini kullanmanız gerekmez. Her ikisi de sadece karışıklığa katılıyor. Widget'larınızı bir sözlük olarak saklayın, verileri doğrudan giriş widget'ından alın ve her şeyin yönetilmesi kolaylaşır.

import tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     b = tk.Button(self, text="Done!", command=self.upload_cor) 
     b.pack() 
     table = tk.Frame(self) 
     table.pack(side="top", fill="both", expand=True) 

     data = (
      (45417, "rodringof", "CSP L2 Review", 0.000394, "2014-12-19 10:08:12", "2014-12-19 10:08:12"), 
      (45418, "rodringof", "CSP L2 Review", 0.000394, "2014-12-19 10:08:12", "2014-12-19 10:08:12"), 
      (45419, "rodringof", "CSP L2 Review", 0.000394, "2014-12-19 10:08:12", "2014-12-19 10:08:12"), 
      (45420, "rodringof", "CSP L2 Review", 0.000394, "2014-12-19 10:08:12", "2014-12-19 10:08:12"), 
      (45421, "rodringof", "CSP L2 Review", 0.000394, "2014-12-19 10:08:12", "2014-12-19 10:08:12"), 
      (45422, "rodringof", "CSP L2 Review", 0.000394, "2014-12-19 10:08:12", "2014-12-19 10:08:12"), 
      (45423, "rodringof", "CSP L2 Review", 0.000394, "2014-12-19 10:08:12", "2014-12-19 10:08:12"), 
     ) 

     self.widgets = {} 
     row = 0 
     for rowid, reviewer, task, num_seconds, start_time, end_time in (data): 
      row += 1 
      self.widgets[rowid] = { 
       "rowid": tk.Label(table, text=rowid), 
       "reviewer": tk.Label(table, text=reviewer), 
       "task": tk.Label(table, text=task), 
       "num_seconds_correction": tk.Entry(table), 
       "num_seconds": tk.Label(table, text=num_seconds), 
       "start_time": tk.Label(table, text=start_time), 
       "end_time": tk.Label(table, text=start_time) 
      } 

      self.widgets[rowid]["rowid"].grid(row=row, column=0, sticky="nsew") 
      self.widgets[rowid]["reviewer"].grid(row=row, column=1, sticky="nsew") 
      self.widgets[rowid]["task"].grid(row=row, column=2, sticky="nsew") 
      self.widgets[rowid]["num_seconds_correction"].grid(row=row, column=3, sticky="nsew") 
      self.widgets[rowid]["num_seconds"].grid(row=row, column=4, sticky="nsew") 
      self.widgets[rowid]["start_time"].grid(row=row, column=5, sticky="nsew") 
      self.widgets[rowid]["end_time"].grid(row=row, column=6, sticky="nsew") 

     table.grid_columnconfigure(1, weight=1) 
     table.grid_columnconfigure(2, weight=1) 
     # invisible row after last row gets all extra space 
     table.grid_rowconfigure(row+1, weight=1) 

    def upload_cor(self): 
     for rowid in sorted(self.widgets.keys()): 
      entry_widget = self.widgets[rowid]["num_seconds_correction"] 
      new_value = entry_widget.get() 
      print("%s: %s" % (rowid, new_value)) 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop() 

Aslında farklı bir add_row yöntemiyle Table sınıfı yaratarak bu biraz uygulayacağını, ama çok karmaşık almak istemedi:

İşte çalışan bir örnek. Temel fikir, bir Table sınıfı oluşturup oluşturmamanızla aynıdır, hepsini bir sınıfta yapın veya prosedürel olarak yapın - verilerinizi temsil edecek bir sözlük oluşturun. İç içe geçmiş listeleri de kullanabilirsiniz, ancak sözlüklerin kullanımını daha kolay buluyorum. Onlar da kendi kendini belgeliyorlar, çünkü sütun 4'ün başlangıç ​​zamanı olduğunu bilmekten ziyade sembolik bir isimle referans yapıyorsunuz.

+0

Bu aslında oldukça harika, bence şimdi farklı bir bakış açısından bunu anlıyorum. Sadece bir sorum daha var, sonuçların pencereden daha büyük olması durumunda bir kaydırma çubuğunu nasıl yerleştirebilirim? mümkün mü? Teşekkürler!!!! – rodrigocf

+0

Ve eğer bunu başka bir soru için saklayalımsa lütfen bana bildirin :) – rodrigocf

+0

@rodrigocf: bu daha önce yanıtlanmış ayrı bir soru. Bkz. Http://stackoverflow.com/a/3092341/7432 –