Попытка обновить ScrolledText и выпадающий список из tkinter python - PullRequest
0 голосов
/ 08 февраля 2019

Итак, у меня есть код, который будет читать в файле 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)

Я ценю любую помощь с этим, поскольку пользовательский интерфейс на самом деле не моя вещь, и я пытаюсь научиться этому

1 Ответ

0 голосов
/ 19 февраля 2019

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

def getItemsPerLine(dropdownValues, listboxWidget):
    # Clear the list
    listboxWidget.delete(0,'end')
    x = 1
    for item in dropdownValues:
       listboxWidget.insert(x, item)
       x += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...