现在我正在尝试编写代码,从文本框中提取一个值,并将其插入到我的 SQL 表中。我很确定我的代码编写正确,但我认为我需要定义一些东西,但我不确定格式或如何进行。我收到错误:
缺少 3 个必需的位置参数:“db”、“query”和“parameters”
此外,我在从 wx.ListCtrl 返回所选值时遇到问题。我可以让它检测到正确的选择,但到目前为止我所能做的就是返回选择编号(例如 0,1,2,3 等)而不是实际的字符串。我怎样才能让它正确阅读?
下面是一个最小的代码示例。
import sys
import wx
from six.moves import urllib
import wx.adv
import datetime
from datetime import date
import sqlalchemy
from sqlalchemy import *
import sqlalchemy_utils
import pandas as pd
from datetime import datetime
import _strptime
import os
#Reads the SQL Column to use for the dropdown menu
params = urllib.parse.quote_plus("Driver={ODBC Driver 18 for SQL Server};"
"Server=SERVER;"
"Database=DATABASE;"
"Trusted_Connection=yes;"
"TrustServerCertificate=yes"
)
engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
engine.connect()
#Gets list of Part Numbers for the menubox as well as matching to SQL DF
sqlread = pd.read_sql_query('''SELECT * FROM TABLE''',engine)
pndf = pd.DataFrame(sqlread, columns = ['PN'])
pndf = pndf[pndf.PN != None]
dflist = pndf.values.tolist()
class compwin(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,'Test',
size=(400,600))
panel = wx.Panel(self,-1)
#Prompts for Update Field
wx.TextCtrl(panel,value = "________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________",size=(1300,20),pos=(-1,275),style=wx.TE_READONLY|wx.BORDER_NONE)
wx.TextCtrl(panel,value = "Update What Part?",size=(100,20),pos=(25,325),style=wx.TE_READONLY|wx.BORDER_NONE)
#Text Boxes for Update Field
self.ComboUp = wx.ListCtrl(panel, wx.ID_ANY, size=(150,125),pos=(20,350),style=wx.LC_REPORT)
self.ComboUp.InsertColumn(0,"Select a Part Number:",format=wx.LIST_FORMAT_RIGHT,width=150)
for Part in dflist:
self.ComboUp.Append(Part)
#update field bindings
#Prompts for add field
wx.TextCtrl(panel,value = "Part Number",size=(100,20),pos=(75,100),style=wx.TE_READONLY|wx.BORDER_NONE)
self.PNAdd = wx.TextCtrl(panel,value = "",size=(125,20),pos=(60,125))
#define buttons
self.sysexit = wx.Button(panel,label="Exit", name="1",pos=(100,500))
self.add = wx.Button(panel,label="Add Record", name="2",pos=(300,125))
#bindings for panel
self.Bind(wx.EVT_BUTTON,self.OnClick_exit,self.sysexit)
self.Bind(wx.EVT_BUTTON,self.add_data,self.add)
self.Bind(wx.EVT_LIST_ITEM_SELECTED,self.OnSelectAdd,self.ComboUp)
self.add.SetDefault()
######################### COMBO BOX SELECTION ######################################################################
def OnSelectAdd(self,e):
item_select = self.ComboUp.GetFocusedItem()
if item_select != -1:
textprint = self.ComboUp.GetItem(item_select).GetItemText()
print(textprint)
############################################# EXIT BUTTON ######################################################################
def OnClick_exit(self,e):
self.Close()
############################################ ADD RECORD BUTTON ############################################################
def add_data(self,e,db: sqlalchemy.engine.base.Engine, query: str,parameters: dict):
log_headline: str = "insert_data() ::"
"""
:param db:
:param query: INSERT INTO DATABASE.TABLE(PN) VALUES(:PN)
:param parameters: {self.PNAdd.GetValue():PN}
:return:
"""
stmt = sqalchemy.text(query)
try:
print("Testing...")
with engine.connect() as conn:
conn.execute(stmt, parameters=parameters)
conn.commit()
except Exception as e:
print("Error!")
if __name__ == '__main__':
app = wx.App()
frame = compwin()
frame.Show()
app.MainLoop()
这是获取已在
wx.ListCtrl
中选择的项目的详细信息的一种方法。import wx
dflist = [
["123","Widget 1", "w101"],["456","Widget 2", "w2091"],["789","Widget 3", "w3000"],["132","Widget 4", "w404"],
["465","Widget X", "x555"]
]
class compwin(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,'Shortage Sheet Compiler v0.1',
size=(600,300))
panel = wx.Panel(self,-1)
#textbox printout
#Prompts for Update Field
wx.TextCtrl(panel,value = "Update What Part?",size=(150,20),pos=(25,20),style=wx.TE_READONLY|wx.BORDER_NONE)
#Text Boxes for Update Field
self.Combobox = wx.ListCtrl(panel, wx.ID_ANY, size=(400, -1),pos=(25, 50), style=wx.LC_REPORT)
self.Combobox.InsertColumn(0, "Item", wx.LIST_FORMAT_RIGHT)
self.Combobox.InsertColumn(1, "Name", wx.LIST_FORMAT_RIGHT)
self.Combobox.InsertColumn(2, "Part Number", wx.LIST_FORMAT_RIGHT)
self.Combobox.SetColumnWidth(1, 150)
self.Combobox.SetColumnWidth(2, 150)
for item in dflist:
self.Combobox.Append((item[0],item[1],item[2]))
self.Combobox.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
def OnItemSelected(self, event):
ind = event.GetIndex()
item = self.Combobox.GetItem(ind, 0).GetText()
name = self.Combobox.GetItem(ind, 1).GetText()
part = self.Combobox.GetItem(ind, 2).GetText()
print("item", item, "name", name, "part number", part)
if __name__ == '__main__':
app = wx.App()
frame = compwin()
frame.Show()
app.MainLoop()
关于
Add
功能:self
和 event
来调用。add_data
例程中定义这些内容,并将它们从参数列表中删除,参数列表应包含 (self, event)
快乐的足迹!