Попытка обновить ScrolledText и поле со списком из tkinter python

У меня есть код, который будет читать файл json из метода. Что я хочу сделать, так это. Этот метод вызывается при открытии программы. И вызывается снова, когда пользователь нажимает кнопку, которая отправляет запрос json на сервер, а затем изменяет там базу данных. Теперь, когда пользователь нажимает кнопку, я хочу обновить значения, которые находятся внутри виджетов со списком и прокручиваемым текстом. Я просто могу сделать это правильно. Он либо ничего не делает, либо добавляет в низ лишнее.

Я хотел бы очистить прокручиваемый текст и значение поля со списком и переписать их из нового файла Json.

Что у меня есть до сих пор.

from tkinter import *
from tkinter.ttk import *
from tkinter import scrolledtext
from tkinter import messagebox

# AI devices imports
from SmartAdFSM import ADControlSystem as aic
from SmartAdFSM.AdUtility import AdHelperMethods as adm


# Varialbes that are collected from differnt APIs
# TODO:Replace with real ads from Google/Yahoo/Facebook
# TODO: Create method to gather all avalialbe ads from service providers     and create
#  1: list of all ads form API, '(Yahoo, Google, Facebook)
#  2: FSM for all ads


# List for ads
# They are broken up first by service provider then added into a master list
currentAds = []        # This holds every add from every service provider.
apiYahooAds = []  # This holds every yahoo add

jsonFile = "TestAds/YahooAd.json"

# Get the initial setup and read the new info from Yahoo API
adm.CreateYahooAdList(jsonFile, apiYahooAds, currentAds)


# Add ad values into the list for dropdown and fsm
# Initial set up of the UI
ddMenuValues = []  # names of each ad
adTitles = []  # The FSM for each ad


def activateClicked():
    target = dropdownWidget.get()
    msg = "{} Ad is now active".format(target)
    for targetAd in currentAds:
        if target == targetAd.title:
            aic.controlFSM(targetAd, "activate")
            messagebox.showinfo('Action', msg)
            # collect the updated API from yahoo API to update the UI
            adm.CreateYahooAdList(jsonFile, apiYahooAds, currentAds)
                adm.UpdateUI(adTitleViewWidget,dropdownWidget,adTitles,ddMenuValues,currentAds)
            break


def deactivateClicked():
    target = dropdownWidget.get()
    msg = "{} Ad in now inactive".format(target)
    for targetAd in currentAds:
        if target == targetAd.title:
            aic.controlFSM(targetAd, "pause")
            messagebox.showinfo('Action', msg)
            # collect the updated API from yahoo API to update the UI
            adm.CreateYahooAdList(jsonFile, apiYahooAds, currentAds)
            break


def endClicked():
    target = dropdownWidget.get()
    msg = "{} Ad in now ended".format(target)
    for targetAd in currentAds:
        if target == targetAd.title:
            aic.controlFSM(targetAd,  "delete")
            messagebox.showinfo('Action', msg)
            # collect the updated API from yahoo API to update the UI
            adm.CreateYahooAdList(jsonFile, apiYahooAds, currentAds)
            break


window = Tk()

window.title("SmartAd Manager IgniterLabs")
window.geometry("900x500")

# Widgets

mainLabel = Label(window, text = "Welcome to SmartAd management Tool",
              font=("Arial Bold", 12))

activeAdsLabel = Label(window, text = "Current Ads Available")

# Activate button
activateButton = Button(window, text = "Activate Ad",
                    command=activateClicked)
# Deactivate Button
deactivateButton = Button(window, text = "Deactivate Ad",
                      command=deactivateClicked)

# End Button
endButton = Button(window, text = "End Ad",
               command=endClicked)
# Quit button
quitButton = Button(window, text = "Quit",
                command=quit)

# Combo box to select the Ad
dropdownWidget = Combobox(window)
# Set the dropdownmenu contents
# Text filed for user
adTitleViewWidget = scrolledtext.ScrolledText(window)
# set the textfeild' contents
adm.UpdateUI(adTitleViewWidget, dropdownWidget, adTitles, ddMenuValues,currentAds)



# Set main label position on grid
mainLabel.grid(column=0, row=0)
dropdownWidget.grid(column=0, row=1)
activateButton.grid(column=1, row=1)
deactivateButton.grid(column=2, row=1)
endButton.grid(column=3, row=1)
activeAdsLabel.grid(column=0, row=2)
adTitleViewWidget.grid(column=0, row=3, columnspan=3)
quitButton.grid(column=0, row=4)

window.mainloop()

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

def CreateYahooAdList(jsonSource, yahooAdList, adList):
    # Test Ad simulate call from API
    # TODO: Create call to API for Yahoo Ad to get every ad that is     available
    readFromAPI = jsonSource
    # read in the file
    parsedFile = yjp.readinJson(readFromAPI)
    # create objects for each ad and add them into the Yahoo Ad list
    yjp.createAdObjects(yahooAdList, parsedFile)

    # Then add all the new Yahoo parsed ads (Now Ad Objects) into the     myAds list
    for ad in yahooAdList:
        adList.append((ad))


'''
This method will get values from a Json file 
In the future it will pull it off the Yahoo API
@:param textFeildValues = adTitles[] from SimpleUIControler
@:param comboValues = ddMenuValues[] from SimpleUIControler
@:param ads = currentAds from SimpleUIControler
'''


def UpdateUIValues(textFeildValues, comboValues, ads):
    for ad in ads:
        title = ad.title
        status = ad.status
        comboValues.append(title)
        textFeildValues.append(title + "-" + status + "\n")


def UpdateUI(adTitleViewWidget, dropdownWidget, adTitle, dropdownValues, currentAds):

    # First update the values to be used
    UpdateUIValues(adTitle, dropdownValues, currentAds)
    # Clear exsiting UI
    adTitleViewWidget.delete(1.0, END)
    for ad in adTitle:
        adTitleViewWidget.insert(END, ad)

    dropdownWidget['values'] = dropdownValues
    # The init value
    dropdownWidget.current(0)
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
309
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

def getItemsPerLine(dropdownValues, listboxWidget):
    # Clear the list
    listboxWidget.delete(0,'end')
    x = 1
    for item in dropdownValues:
       listboxWidget.insert(x, item)
       x += 1

Другие вопросы по теме