0

有没有人使用过 tkinter 表?我在将数据添加到新行时遇到问题。我有一个输入字段,用户可以在其中输入对象。然后在def onButtonSents()我检查这个词是否包含在objects数组中并将这个对象输入到表命名对象的第一列中,在第二列中我添加对象的积极情绪,依此类推。我想通过单击按钮添加新行并将字典的一行值的不同列放入。这是我现在拥有的:

file sentiment_analysis.py:
    objects [] #an array of objects which user enters into entry field
    positiveSentiments = dict()  #dictionary with key - object and positive words which correspond to it
    negativeSentiments = dict()  #dictionary with key - object and negative words which correspond to it


    array_cols = ['Object', 'Positive sentiments', 'Negative sentiments'] 
    var = tktable.ArrayVar()

#below is initialization of my tkinter table

    import tktable
    array_cols = ['Object', 'Positive sentiments', 'Negative sentiments']
    var = tktable.ArrayVar()
    table = tktable.Table(frame,
        rows = 1,
        cols = 3,
        roworigin=0,
        colorigin=0,
        variable=var,)
    table.pack(side='bottom', fill='both')
    var.set(index='0,0', value = 'Object')
    table.tag_configure('active', )
    var.set(index='0,1', value = 'Positive Sentiments')
    var.set(index='0,2', value = 'Negative Sentiments')

#The method which puts data into the rows of table
    def onButtonSents():
        table.insert_rows(1)
        for i in range (1, 5):
            index1 = '%i,%i'  % (i, 0)
            table.activate(index1)
            for key in sentiment_analysis.positiveSentiments.keys():
                if key == entry.get():
                    var.set(index='active', value=entry.get())
            for i in range (1, 5):
                index2 = '%i,%i'  % (i, 1)
                table.activate(index2)
            for key in sentiment_analysis.positiveSentiments.keys():
                if key == entry.get():
                    var.set(index='active',   value=sentiment_analysis.positiveSentiments[key])
            for i in range (1, 5):
                index3 = '%i,%i'  % (i, 2)
                table.activate(index3)
            for key in sentiment_analysis.negativeSentiments.keys():
                if key == entry.get():
                    var.set(index='active', value=sentiment_analysis.negativeSentiments[key])

但是表格的单元格没有正确填充。如果正确填充第一个对象,但是所有对象都变得相同,就像我第一次输入“ubs”一样,当我输入第二个“小麦”时,第一个对象也变成了“小麦”,他们的情绪也发生了变化。

不幸的是,我在互联网上没有找到任何关于这个问题的建议。我将非常感谢任何建议!

4

1 回答 1

0

下面我已经包含了我对您的代码的重写,以按照您的预期方式工作。

这对我来说运行正常。

请让我知道这对你有没有用。

请注意:我使用的是 Python 3.6、tkinter 和 tktable。

在我展示代码之前,我将简要解释一下用于将数据设置为一行的 tktable 语法。

您的代码在正确的轨道上,但有一些错误阻止它工作。

您的第一个错误是使用“var.set”将数据设置为 tktable 数组变量。

相反,您应该一直使用“table.set”将数据设置为 tktable“table”路径名变量。

其次,因为您将数据设置为一行,所以您可以使用 set 'row' 选项。

第三,您不需要指定“index=”和“value=”。

您可以简单地输入索引和值,用逗号分隔。

如果您为索引和值创建了变量,则可以使用变量名称。

要将多个值设置为同一行上的多个索引,

您只需添加更多值,用逗号分隔。

您只需要指定该行中第一个单元格的索引。

例如:

你写了:

var.set(index='active', value=entry.get())

这应该是:

table.set('row', '1,0', entry.get(), '正面情绪', '负面情绪')

上述行假定您希望此“行”从单元格索引“1,0”开始。

您提供的代码没有为我运行。

因此,为了让代码按预期运行,我添加了一个类结构。

如果您对类以及如何使用它们有疑问,这些问题中的大部分已经由 Bryan Oakley 和其他人在 Stack Overflow 上得到详细解答。

我添加到您的代码中的类结构是基于我通过 Stack Overflow 从 Bryan Oakley 那里学到的。

此外,我还进行了以下其他更改:

通过更改条件语句并更正“insert_rows”语法,修改了您的 onButtonSents 方法,

以便将正确的数据添加到您指定的下一个新行。

如果您对此有任何疑问,请告诉我。

在“对象”列表和字典中添加了一些测试样本数据:“positiveSentiments”和“negativeSentiments”,

演示代码是如何工作的。

由于您没有指定当用户输入不在列表中的对象时您希望代码的行为方式,

我把这个留给你自己做。

这是修改后的代码:

import tkinter as tk

import tktable

from tkinter import Tk, Label, Button

from tkinter import *


class Control(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.controller = self

        self.shared_data = {
            "objects": tk.Variable(),
            "positiveSentiments": tk.Variable(),
            "negativeSentiments": tk.Variable(),
            "x": tk.IntVar(),
        }

        self.title('Title of Control Class')


        self.entry_frame = tk.Frame()

        self.entry_frame.pack(side=TOP)


        self.user_input = tk.StringVar()

        self.test_entry = tk.Entry(self.entry_frame, textvariable=self.user_input)

        self.test_entry.pack(side=LEFT)


        self.test_button = tk.Button(self.entry_frame, text='Button', command=self.onButtonSents)

        self.test_button.pack(side=RIGHT)


        self.table_frame = tk.Frame()

        self.table_frame.pack(side=BOTTOM)


        self.array_cols = ['Object', 'Positive sentiments', 'Negative sentiments']

        self.var = tktable.ArrayVar()
        
        self.table = tktable.Table(self.table_frame,
            rows = 1,
            cols = 3,
            roworigin=0,
            colorigin=0,
            colwidth=20,
            variable=self.var,)
        
        self.table.pack(side='bottom', fill='both', expand=True)
        
        self.table.set('row', '0,0', 'Object','Positive Sentiments', 'Negative Sentiments')
        
        self.table.tag_configure('active', )

        
        self.shared_data["objects"] = ['object1', 'object2', 'object3', 'object4', 'object5', 'object6', 'object7'] #an array of objects which user enters into entry field

        self.shared_data["positiveSentiments"] = {'object1' : 'positive1', 'object2' : 'positive2', 'object3' : 'positive3', 'object4' : 'positive4', 'object5' : 'positive5', 'object6' : 'positive6', 'object7' : 'positive7' }  #dictionary with key - object and positive words which correspond to it

        self.shared_data["negativeSentiments"] = {'object1' : 'negative1', 'object2' : 'negative2', 'object3' : 'negative3', 'object4' : 'negative4', 'object5' : 'negative5', 'object6' : 'negative6', 'object7' : 'negative7'}  #dictionary with key - object and negative words which correspond to it



    #The method which puts data into the rows of table



    def onButtonSents(self, _event=None):
        #self.table.insert_rows(1)
        for o in self.shared_data["objects"]:
            if o == self.user_input.get():
                if o in self.shared_data["positiveSentiments"]:
                    if o in self.shared_data["negativeSentiments"]:
                        if self.shared_data["x"].get() is not None:
                            self.shared_data["x"].set(self.shared_data["x"].get() + 1)
                            self.index1 = '%i,%i'  % (self.shared_data["x"].get(), 0)
                            self.table.insert_rows(self.shared_data["x"].get() - 1, 1)

                            self.table.set('row', self.index1, self.user_input.get(), self.shared_data["positiveSentiments"].get(o), self.shared_data["negativeSentiments"].get(o))

                        else:                            
                            self.shared_data["x"].set(1)
                            self.index1 = '%i,%i'  % (self.shared_data["x"].get(), 0)
                            self.table.set('row', self.index1, self.user_input.get(), self.shared_data["positiveSentiments"].get(o), self.shared_data["negativeSentiments"].get(o))

                         


Control1 = Control()

Control1.mainloop()
于 2021-12-31T07:17:38.947 回答