1

jQuery/AJAXを使用してPHPでチャットアプリを作成しました。そして今、私はチャットの表示と管理に使用されるGUI(Tkinter)を使用してPython(2.7.3)アプリを作成しようとしています。

ユーザーとチャットの情報を保存するMySQLデータベースがあります。

ブラウザでは、setInterval呼び出しとAJAX呼び出しを使用することで、ページを更新せずに新しいメッセージを取得できます。

Pythonアプリでは、「after」を使用して関数を呼び出し、setIntervalなどの情報を取得しました。私はそれが機能していると思います。ただし、ブラウザで送信した新しいエントリを取得できません。

アプリを再起動せずに(Pythonアプリの起動後に)新しく送信されたエントリを取得するにはどうすればよいですか?

MySQLdbモジュールを使用してデータベースにアクセスして変更し、ローカルホストで作業しています。

例として、get_messages関数を投稿しています。

def get_messages(sohbet_id, messages_name):
    messages_name.delete(1.0, END) # Remove the content of Text widget
    sql = "SELECT *
        FROM ileti
        WHERE sohbet_id='" + str(sohbet_id) + "'
        ORDER BY created ASC"
    cursor.execute(sql)
    result = cursor.fetchall() # Fetch all the chat info
    chat = ""
    for i in result:
        name = chatter_name(i[1])
        time = datetime.fromtimestamp(i[4]).strftime("%H:%M:%S")
        chat += time + " " + str(name) + ": " + str(i[3]) + "\n" # Create a string of chat messages
    messages_name.insert(END, chat) # Insert all the chat messages to the Text widget
    messages_name.yview(END) # Scroll it down so that the latest message can be seen
    messages_name.after(1000, lambda: get_messages(sohbet_id, messages_name)) # Run this again after 1 second
    return

編集:もう少し情報:実際に関数でウィジェットを作成します。アプリが起動すると、メインフレームのみが表示され、最初のタブ(すべてのチャットの概要)を作成する関数を呼び出します。次に、その関数は、新しいタブ(個別の)チャットを開く別の関数を呼び出します。これらの個々のチャットタブには、そのチャット(またはタブ)に属するチャットメッセージをクエリするためのこのget_messages関数があります。上記の関数では、messages_nameは実際にはテキストウィジェットです。その関数で変更しているので、それを関数に渡します(他の方法は見つかりませんでした)。get_messagesが呼び出されると、新しい行は表示されません。それらを取得する唯一の方法は、アプリを再起動することです。これは、アプリが起動すると、そのインスタンスのデータベースからすべてのデータを取得するようなもので、それだけです。私が知っている唯一のことは、PHPとのようなものが必要になるでしょう

4

1 に答える 1

1

データを取得して挿入するメソッドを使用してクラスのデータベースに接続すると、問題が解決しました。

それがクラスです:

class DBConnection(object):

    def __init__(self, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME):
        self.host = DB_HOST
        self.port = DB_PORT
        self.name = DB_NAME
        self.user = DB_USER
        self.password = DB_PASSWORD
        self.con = None

    def connect_db(self):
        if self.con is None:
            self.con = MySQLdb.connect(host = self.host,
                                        port = self.port,
                                        db = self.name,
                                        user = self.user,
                                        passwd = self.password)
            self.con.set_character_set("utf8")
        return self.con

    def fetch_db(self, query):
        self.query = query
        self.cursor = self.con.cursor()
        self.cursor.execute("SET NAMES utf8;")
        self.cursor.execute("SET CHARACTER SET utf8;")
        self.cursor.execute("SET character_set_connection=utf8;")
        self.cursor.execute(self.query)
        self.result = self.cursor.fetchall()

        return self.result

    def insert_db(self, query):
        self.query = query
        self.cursor = self.con.cursor()
        self.cursor.execute("SET NAMES utf8;")
        self.cursor.execute("SET CHARACTER SET utf8;")
        self.cursor.execute("SET character_set_connection=utf8;")
        self.cursor.execute(self.query)
        self.con.commit()

        return

それが私が(メインループの前に)接続する方法です:

DBC = DBConnection('localhost',3306,'root','','sohbet')
con = DBC.connect_db()

そして、それは私がクエリを行う方法です:

result = DBC.fetch_db("SELECT * FROM ileti WHERE sohbet_id='" + str(sohbet_id) + "' ORDER BY created ASC")

ただし、mmgpで説明したように、クエリの実行方法を確認する必要があります。

于 2013-02-10T04:53:25.340 に答える