从 wx.TextCtrl 将值插入 SQL 并从 wx.ListCtrl 提取选择值

问题描述 投票:0回答:1

现在我正在尝试编写代码,从文本框中提取一个值,并将其插入到我的 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()
python sql-server sqlalchemy wxpython
1个回答
0
投票

这是获取已在

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)

快乐的足迹!

© www.soinside.com 2019 - 2024. All rights reserved.