SELECT查询结果在Treeview更新中不正确

时间:2019-01-10 18:27:13

标签: python mysql sql tkinter treeview

这是一个非常复杂的问题,我将尽力为您提供所需的数据/代码。任何帮助表示赞赏。

上下文

AssignBadgeFrame

这是tkinter框架,用户可以将其分配给侦察员徽章。如您所见,它由三个不同的ttk.Treeviews组成。一个包含在MySQL表的标记表中找到的所有标记名称,另一个包含在MySQL数据库的巡检表中找到的所有巡检名称。

选择巡逻后,名称列表会出现在最后一个树形视图中。这些是属于该巡逻队的侦察员。

示例:

Display

为...

Patrol Table enter image description here

问题

按下返回键时,将调用应使用的功能:

  1. 清除包含侦察员名称的树状视图
  2. 通过在拥有的徽章表中创建新行,将徽章分配给侦察兵
  3. 将尚未收到徽章的选定巡逻中所有侦察员的姓名返回给Treeview。

总体效果是,当选择了Scout并按了Return键时,该Scout将被删除,而其他Scout则保留在Treeview中。但是请记住,可以选择多个侦察兵

下面是按回车键时执行的功能。

def selectScout():
    global SelectedBadgeStr
    global SelectedPatrolStr
    Values=[]
    if SelectedPatrol.get()==("Selected Patrol: Please Select A Patrol"):
        tk.messagebox.showerror("ERROR","Please select a Patrol")
        return
    if SelectedBadge.get()==("Selected Badge: Please Select A Badge"):
        tk.messagebox.showerror("ERROR", "Please select a Badge")
        return
    print(SelectedBadgeStr)
    curItems = SelectScoutView.selection()
    for i in curItems:
        Values.append(SelectScoutView.item(i)['values'])
    print(Values)
    for i in Values:
        print(SelectedBadgeStr)
        print(i)
        print(i[0])
        print(i[1])
        print(type(i))
        print(type(i[0]))
        Test=("Test")
        print(repr(i[0]))
        GetBadgeID=("SELECT badgeID FROM badges WHERE badgename=%s")
        mycursor.execute(GetBadgeID,(SelectedBadgeStr,))
        BadgeID=mycursor.fetchone()
        print(BadgeID)
        GetScoutID=("SELECT scoutID FROM scoutinfo WHERE firstname=%s AND secondname=%s")
        mycursor.execute(GetScoutID,(i[0],i[1]))
        ScoutID=mycursor.fetchone()
        UpdateOwnedBadgesB="INSERT INTO ownedbadges (badgeID,scoutID) VALUES(%s,%s) "
        mycursor.execute(UpdateOwnedBadgesB,(BadgeID[0],ScoutID[0]))
        mydb.commit()
    #Removing Those Who Now Own The Badge
    ScoutNameList=[]
    Remove = SelectScoutView.get_children()
    for child in Remove:
        SelectScoutView.delete(child)
    print("The Badge:",SelectedBadgeStr,"ID Is",BadgeID[0])
    ScoutIDSWhoOwnBadge=("SELECT scoutID FROM ownedbadges WHERE badgeID=%s")
    mycursor.execute(ScoutIDSWhoOwnBadge,(BadgeID[0],))
    BadgeScoutIDS=mycursor.fetchall()
    print("BadgeScoutIDS")
    print(BadgeScoutIDS)
    for i in BadgeScoutIDS:
        print(i)
        print(i[0])
        print(repr(i[0]))
        ScoutNames="SELECT firstname AND secondname FROM scoutinfo WHERE scoutID=%s"
        mycursor.execute(ScoutNames,(i[0],))
        print("SELECT QUERY RESULTS:")
        print(mycursor.fetchall())
        Name=mycursor.fetchall()
        print("Should Be Names Below:")
        print(Name)
        ScoutNameList.append(Name)
    print(ScoutNameList)
    ScoutNamesByPatrol=("SELECT firstname,secondname FROM scoutinfo WHERE patrolID=(SELECT patrolID FROM patrols WHERE patrolname=%s)")
    mycursor.execute(ScoutNamesByPatrol,(SelectedPatrolStr,))
    ScoutNamedFromPatrol=mycursor.fetchall()
    print(ScoutNamedFromPatrol)
    print("Done")
    return

(我很清楚此功能不满足将数据重新插入到Treeview中的要求)

错误出现在

Name=mycursor.fetchall()

错误:

mysql.connector.errors.InterfaceError: No result set to fetch from.

发生此错误是因为SELECT查询:

ScoutNames="SELECT firstname AND secondname FROM scoutinfo WHERE scoutID=%s"
mycursor.execute(ScoutNames,(i[0],))

收益:

[(0,)]

代替侦察兵的名字和名字。 即使(i[0],)) = 51 或等效的童军ID。

结果

我现在将带您通过一个例子,以便您更好地理解问题。

Example

如您所见,徽章“ Tracking Badge”已被选择,巡逻“ Panther”已被选择,童军“ Rory Adair”已被选择。我们要给Panther Patrol的Rory Adair跟踪徽章

预期结果:

树形视图中包含“ Rory Adair”的行被删除,其他两个尚未收到徽章的侦察兵则留在树形视图中。

“ Rory Adair”的ScoutID将与badgeID一起添加到ownerbadges表中。

实际结果:

Treeview中的所有行均被删除

所有权徽章表已成功修改,如下所示。

Example Table

(忽略“已接收”列,因为其目的尚未定义...) (我知道他们没有将行/侦察器名称bck添加到Treeview中的代码,但是在问题解决之前,我无法做到这一点)

0 个答案:

没有答案