Как мне поступить с "могу только объединить str (не" StringVar ") в str" - PullRequest
0 голосов
/ 13 июня 2019

Здравствуйте, я сейчас работаю над 4 списком.Когда я проверяю, возвращает ли combobox значение combobox, он выдает исключение tkinter.

Я попытался погуглить проблему и сделал некоторые корректировки кода, но ни один из них не помог:

import sys
import tkinter.messagebox as box
from tkinter.filedialog import asksaveasfile
if sys.version_info[0] >= 3:
    import tkinter as tk
    import tkinter.ttk as ttk
else:
    import Tkinter as tk


class App(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)

        self.dict = {'Japan': ['Yokohama', 'Kobe', 'Tokyo'],
                     'China': ['Ningbo', 'Shanghai', 'Hefei'],
                     'USA': ['Baltimore', 'Long Beach', 'Chicago'],
                     'Russia': ['Moscow']}
        self.i = ["EXW", "FOB", "DAT"]
        self.c = ["40ton", "20ton", "Other"]

        self.variable_c = tk.StringVar(self)
        self.variable_i = tk.StringVar(self)
        self.variable_a = tk.StringVar(self)
        self.variable_b = tk.StringVar(self)
        self.last_county = tk.StringVar(self)
        self.area = tk.StringVar(self)
        self.country = tk.StringVar(self)
        self.incoterm = tk.StringVar(self)
        self.capacity = tk.StringVar(self)

        self.variable_b.trace('w', self.fun2)
        self.variable_a.trace('w', self.update_options)
        self.variable_i.trace('w', self.fun3)
        self.variable_c.trace('w', self.fun4)

        self.combobox_i = ttk.Combobox(self, values=list(self.i), 
        state='readonly')
        self.combobox_i.bind("<<ComboboxSelected>>", self.fun3)
        self.combobox_i.current(0)

        self.combobox_c = ttk.Combobox(self, values=list(self.c), 
        state='readonly')
        self.combobox_c.bind("<<ComboboxSelected>>", self.fun4)
        self.combobox_c.current(0)

        self.combobox_a = ttk.Combobox(self, 
        values=list(self.dict.keys()), state='readonly')
        self.combobox_a.bind("<<ComboboxSelected>>", self.fun)
        self.combobox_a.current(0)

        self.combobox_b = ttk.Combobox(self, values=self.dict['Japan'], 
        state='readonly')
        self.combobox_b.bind("<<ComboboxSelected>>", self.fun2)
        self.combobox_b.current(0)




        self.button = ttk.Button(self, text="Check", command=lambda : 
        sample(self.area, self.country, self.incoterm, self.capacity))




        self.combobox_i.pack()
        self.combobox_c.pack()

        self.combobox_a.pack()
        self.combobox_b.pack()
        self.button.pack()
        self.pack()

    def fun(self,*args):
        print("changed 1-st combobox value to: " + self.combobox_a.get())
        if self.last_county != self.combobox_a.get():
        self.combobox_b['values']=self.dict[self.combobox_a.get()]
        self.combobox_b.current(0)
        self.last_county = self.country = self.combobox_a.get()
        return self.variable_a.get()

    def fun2(self, *args):
        print("changed 2-nd combobox value to" + self.combobox_b.get())
        self.area = self.combobox_b.get()
        return self.variable_b.get()

    def fun3(self, *args):
        print("changed 3-rd combobox value to" + self.combobox_i.get())
        self.incoterm = self.combobox_i.get()
        return self.variable_i.get()

    def fun4(self, *args):
        print("changed 4-tth combobox value to" + self.combobox_c.get())
        self.capacity = self.combobox_c.get()
        return self.variable_c.get()


    def update_options(self, *args):
        countries = self.dict[self.variable_a.get()]
        self.variable_b.set(countries[0])

        menu = self.combobox_b['menu']
        menu.delete(0, 'end')

        for country in countries:
            menu.add_command(label=country, command=lambda 
            nation=country: self.variable_b.set(nation))


def sample(area, country, incoterm, capacity):
    box.showinfo('info', 'Selected area: ' + area + '\nSelected country: 
    ' + country + '\nSelected incoterm:' + incoterm
      + '\nSelected capacity' + capacity)

if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    app.mainloop()

Когда я запускаю программу и нажимаю кнопку проверки, она показывает:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\IDL Mongolia\AppData\Local\Programs\Python\Python37- 
32\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "D:/IDLMongolia's/Desktop/Project/Count_Incoterms.py", line 57, in 
<lambda>
self.button = ttk.Button(self, text="Check", command=lambda : 
sample(self.area, self.country, self.incoterm, self.capacity))
File "D:/IDLMongolia's/Desktop/Project/Count_Incoterms.py", line 107, in 
sample
+ '\nSelected capacity' + capacity)
TypeError: can only concatenate str (not "StringVar") to str

Process finished with exit code 0

Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Ошибка не требует пояснений - вы пытаетесь объединить объект StringVar со строкой.

Обычно вам нужно использовать метод get для StringVar, чтобы получить его значение. Но я заметил, что на самом деле вам даже не нужно StringVar, и вы не устанавливали или не изменяли их значения любым способом.

Чтобы исправить ошибку - просто не создавайте StringVars на первом месте. Вместо этого сделайте их пустой строкой.

class App(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)
        ...
        self.area = ""
        self.country = ""
        self.incoterm = ""
        self.capacity = ""

Что я действительно рекомендую, так это вообще не создавать фиктивные переменные. Вы всегда можете получить значения напрямую, хотя `combobox.get () '.

class App(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)
        ...
        #self.area = ""
        #self.country = ""
        #self.incoterm = ""
        #self.capacity = ""

        self.button = ttk.Button(self, text="Check", command=lambda : sample(self.combobox_a.get(), self.combobox_b.get(), self.combobox_i.get(), self.combobox_c.get()))

        ...
1 голос
/ 13 июня 2019

Вы пытаетесь объединить строку и StringVar. Чтобы получить строку из StringVar, используйте метод get.

Самый лучший способ сделать это - вызвать get, когда вы передаете строки в sample. Таким образом, образец не должен знать о StringVar с.

sample(self.area.get(), self.country.get(), self.incoterm.get(), self.capacity.get()))

Я бы искал проблему в другом месте вашего кода, поскольку одна из этих StringVar переменных присваивается из строки. Вызывает исключение, если вы измените параметры, а затем нажмите кнопку проверки.

В вашем коде наверняка есть и другие проблемы, но это решает проблему, о которой идет речь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...