2017-05-27 10 views
1
import wx 
import sqlite3 

class Frame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     self.mainPanel = wx.Panel(self) 

     self.data = ['111111','2222','333','4','555'] 
     self.testcombo = wx.ComboBox(self.mainPanel,-1, choices=self.data, pos=(0,0)) 
#  self.testcombo.Bind(wx.EVT_COMBOBOX, self.comboSave) 
     self.dataLabel = wx.StaticText(self.mainPanel,-1,("Nothing Saved Yet"),pos=(100,50)) 
     self.dataLabel2 = wx.StaticText(self.mainPanel,-1, pos=(100,100)) 
     self.testbut = wx.Button(self.mainPanel, wx.ID_SAVE, pos=(0,180)) 
     self.testbut.Bind(wx.EVT_BUTTON, self.dataSave, id=wx.ID_SAVE) 

     self.conn = sqlite3.connect("test1.db") 
     self.cursor = self.conn.cursor() 
     self.cursor.execute('CREATE TABLE IF NOT EXISTS TEST(TEST CHAR(5))') 

     self.autorefresh() 

# def comboSave(self, e): 
#  self.testcomboSave = self.testcombo.GetValue() 

    def dataSave(self, e): 
     self.testcomboSave = self.testcombo.GetValue() 
     self.cursor.execute('INSERT INTO TEST(TEST) VALUES(?)', (self.testcomboSave,)) 
     self.conn.commit() 
     self.dataLabel.SetLabel(self.testcomboSave) 

    def comboLoad(self): 
     self.cursor.execute('SELECT *FROM TEST') 
     for dbLoad in self.cursor.fetchall():pass 
     self.dbLoad = dbLoad[0] 
     self.dataLabel2.SetLabel(self.dbLoad) 

    def autorefresh(self): 
     self.comboLoad() 
     wx.CallLater(1000, self.autorefresh) 

if __name__ == '__main__': 
    app = wx.App() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop() 

コンボボックスの内容をsqilte3にロードしてパネルに自動的にロードすると、テキストに残像があります。何故かはわからない。これはバグですか?Wxpythonパネルは、読み込んだとき自動的にテキストイメージを残します

EX)111111 - > 2222

答えて

1

それはバグ、あなたが他とテキストを1つの上に敷設されていません。 関数comboLoadのすべての反復に対して新しいwx.StaticTextを使うのは方法ではありません。最初にstatictextを作成して、次にその値を更新してください。
また、冗長コードを持っています。autorefresh関数は、特にデータベースに宣言されたキーがないため、データベースの内容を1秒に1回読み込んでいます。つまり、同じ値を何度も繰り返し入力することはできません。エラーが発生します。
私は冗長コードをコメントアウトしていますので、必要なものは何か、何が必要でないかはわかります。
私はこれが以前の投稿よりもあなたのニーズをより正確に満たすと確信しています。

import wx 
import sqlite3 

class Frame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     self.mainPanel = wx.Panel(self) 

     self.data = ['111111','2222','333','4','555'] 
     self.testcombo = wx.ComboBox(self.mainPanel,-1, choices=self.data, pos=(0,0)) 
#  self.testcombo.Bind(wx.EVT_COMBOBOX, self.comboSave) 
     self.dataLabel = wx.StaticText(self.mainPanel,-1,("Nothing Saved Yet"),pos=(100,50)) 
     self.testbut = wx.Button(self.mainPanel, wx.ID_SAVE, pos=(0,180)) 
     self.testbut.Bind(wx.EVT_BUTTON, self.dataSave, id=wx.ID_SAVE) 

     self.conn = sqlite3.connect("test1.db") 
     self.cursor = self.conn.cursor() 
     self.cursor.execute('CREATE TABLE IF NOT EXISTS TEST(TEST CHAR(5))') 

#  self.autorefresh() 

# def comboSave(self, e): 
#  self.testcomboSave = self.testcombo.GetValue() 

    def dataSave(self, e): 
     self.testcomboSave = self.testcombo.GetValue() 
     self.cursor.execute('INSERT INTO TEST(TEST) VALUES(?)', (self.testcomboSave,)) 
     self.conn.commit() 
     self.dataLabel.SetLabel("Item Saved to database: "+self.testcomboSave) 

# def comboLoad(self): 
#  self.cursor.execute('SELECT *FROM TEST') 
#  for dbLoad in self.cursor.fetchall():pass 
#  wx.StaticText(self.mainPanel,label=dbLoad[0],pos=(100,100) 
# 
# def autorefresh(self): 
#  self.comboLoad() 
#  wx.CallLater(1000,self.autorefresh) 

if __name__ == '__main__': 
    app = wx.App() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop() 
+0

私が望むのはデータベースのデータをリストするのではなく、変更するたびにコンボボックスの内容を変更したいのです。私はこれを解決する方法をあなたに尋ねたいと思います。 Ex1)コンボ11111選択 - >パネルテキスト11111 Ex2)コンボ4選択 - >パネルテキスト41111(11111 < - 残像???バグ?) –

+0

私は今考えているものを提供するコードを変更しました。頼んでいる。 –

+0

私はコードを変更しています。 "Self.dataLabel2.SetLabel(self.dbLoad)"部分に適用されています。ありがとうございました。本当に良い教訓でした。私は多くのことを学びました。 –

関連する問題