0

私は Python が初めてで、MySQL データベースからレコードを読み取る単純なデスクトップ アプリケーションに取り組んでいます。mysql db を介して tkinter エントリを使用してライブ検索を行う必要があります。ユーザーがキーボードのキーを押すと、選択可能な自動完全オプションを含む自動提案リストが生成される必要があります...

現時点では、以下のコードは機能しません。なにが問題ですか?

#-*- coding: utf-8 -*-
import Tkinter
from Tkinter import *

import MySQLdb

top = Tkinter.Tk()
top.minsize(300,300)
top.geometry("500x500")

# here we make  text input field
E1 = Entry(top, bd =2)

E1.pack(side = RIGHT)
Lb1 = Listbox(  E1)      # here the list generated from entry but covering it completely is bad ?? 


def clickme(x):

  txtt=E1.get()
  txt=txtt+"%"  

#connection

  db = MySQLdb.connect("127.0.0.1","root","123456","test2",use_unicode=True, charset="utf8"  )
  if db:print"connected"
  cursor=db.cursor()

  cursor.execute("SELECT name FROM `table` WHERE name LIKE '%s' " % (txt))
#------------
  res=cursor.fetchall() 
  i=0
  for query in res: 
    i+=1
    lngth=len(query[0])
    u=query[0].encode('utf-8')
    Lb1.delete (0,lngth)
    if len(txtt)>0:
      Lb1.insert(i, u)
      Lb1.pack()
    else:
        Lb1.delete (0,lngth)
        Lb1.pack_forget()

top.bind("<Key>", clickme)

top.mainloop()
4

1 に答える 1

1

Listbox私はTkinkerを扱っていないので、近くに置く方法がわかりませんが、Entryいくつかの変更を加えました。

Entry にテキストを書き込むと、Listbox に db からのデータが表示されます。

Entry からテキストを削除すると、Listbox が非表示になります。

#!/usr/bin/python
#-*- coding: utf-8 -*-

import Tkinter
from Tkinter import *
import MySQLdb

#----------------------------------------------------------------------

class MainWindow():

    def __init__(self, root):
        frame = Frame(root, width=500, height=500)
        #root.minsize(300,300)
        frame.pack()


        # here we make  text input field

        self.E1 = Entry(frame, bd=2)
        self.E1.pack(side=TOP)

        # here the list generated from entry but covering it completely is bad ?? 

        self.Lb1 = Listbox(frame, bd=2)
        #Lb1.pack(side=BOTTOM)

        root.bind("<Key>", self.clickme)

        # open database (only once) at start program
        self.db = MySQLdb.connect("127.0.0.1", "root", "password", "test", use_unicode=True, charset="utf8")

    #-------------------

    def __del__(self): 
        # close database on exit
        self.db.close()

    #-------------------

    def clickme(self, x):

        txt = self.E1.get()

        self.Lb1.delete(0, END) # delete all on list

        if txt == '':
            self.Lb1.pack_forget() # hide list
        else:
            self.Lb1.pack(side=BOTTOM) # show list

            txt_for_query = txt + "%"  

            cursor = self.db.cursor()

            cursor.execute("SELECT name FROM `table` WHERE name LIKE '%s'" % (txt_for_query))

            res = cursor.fetchall() 

            for line in res: 
                self.Lb1.insert(END, line[0].encode('utf-8')) # append list

            cursor.close()

#----------------------------------------------------------------------

root = Tk()
MainWindow(root)
root.mainloop()
于 2013-11-03T17:37:19.560 に答える