Как показать ответ на запрос БД в Tkinter - PullRequest
0 голосов
/ 12 марта 2011

Я действительно новичок в Tkinter, так что извините за недостаток зрения.Я пытаюсь сделать следующее: предоставить пользователю 3 текстовых поля, которые являются запрашиваемыми полями, кнопку отправки для выполнения запроса и способ отображения результатов.Что касается запросов к БД, я полностью согласен с SQL и Python.Однако сложность этого заключается в том, что я хочу, чтобы пользователь мог щелкнуть по результату и получить дополнительный запрос для получения этого результата для получения дополнительной информации.Проблема в том, что я не могу придумать, как правильно определить, какую запись пользователь нажимает в прокручиваемом текстовом поле.

Есть ли другой виджет, который я должен использовать вместо поля scrollableText для отображения отдельных записей, чтобы, когда пользователь щелкает, я знаю, какой из них он щелкнул?Как вы решили эту проблему?

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Вот как вы могли бы сделать это с Listbox:

import Tkinter as tk

rows = ["A few lines", "of text", "for our example"]
def callback(event):
    lb=event.widget
    # http://www.pythonware.com/library/tkinter/introduction/x5453-patterns.htm
    # http://www.pythonware.com/library/tkinter/introduction/x5513-methods.htm
    items = lb.curselection()
    try: items = map(int, items)
    except ValueError: pass
    idx=items[0]
    print(idx,rows[idx])       
root = tk.Tk()
scrollbar = tk.Scrollbar(root, orient="vertical")
lb = tk.Listbox(root, width=50, height=20,
                yscrollcommand=scrollbar.set)
scrollbar.config(command=lb.yview)
scrollbar.pack(side="right", fill="y")
lb.pack(side="left",fill="both", expand=True)
for row in rows:
    lb.insert("end", row)
    # http://www.pythonware.com/library/tkinter/introduction/events-and-bindings.htm
    lb.bind('<ButtonRelease-1>',callback)
root.mainloop()
2 голосов
/ 12 марта 2011

Предполагая, что каждая запись представляет собой одну строку, создайте тег для каждой строки (от line_num.0 до line_num.end). Для каждого тега используйте text.tag_bind и свяжите свой тег с '<Button-1>', чтобы обнаружить щелчок мыши. Используйте лямбду в обратном вызове, чтобы вернуть номер строки в обработчик событий.

Вот игрушечный пример, который делает именно это:

from Tkinter import *

rows = ["A few lines", "of text", "for our example"]
def callback(row):
    print "you picked row # %s which has this data: %s" % (row, rows[row])

rows = ["A few lines", "of text", "for our example"]
root = Tk()
t = Text(root)
t.pack()

t.insert(END, '\n'.join(rows))
for i in range(len(rows)):
    line_num = i + 1 # Tkinter text counts from 1, not zero
    tag_name = "tag_%s" % line_num
    t.tag_add(tag_name, "%s.0" % line_num, "%s.end" % line_num)
    t.tag_bind(tag_name, "<Button-1>", lambda e, row=i: callback(row))

root.mainloop()
...