输入后如何刷新kivy应用程序

2024-05-17 19:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序有点小问题。当我使用文本输入在“已售出”屏幕中输入内容时,它应该写入csv,并在/CUSTOMERS/ALL CUSTOMERS屏幕中显示从该csv读取的内容。但我必须关闭应用程序,然后在输入时再次打开,才能在/CUSTOMERS/ALL CUSTOMERS中显示。因此,我想我必须在写入csv后再次读取它,我尝试再次调用该方法,但它没有真正起作用。它确实再次读取csv,但它只是不显示在屏幕上。我发布了代码。您需要在同一目录中有一个“prodato.csv”文件,以便代码写入和读取。对不起奇怪的名字,我来自塞尔维亚,希望你能通过脚本导航。先谢谢你

以下是主要脚本:

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from customers import Kupci_sve, Kupci_main, Kupci_pretraga, Duznici
from sold import Prodato


kv = Builder.load_string('''
<MainWindow>:
    name: 'main'
    GridLayout:
        cols:1
        GridLayout:
            rows:5
            Button:
                text:"NEW"

            Button:
                text:"CUSTOMERS"
                on_release:
                    app.root.current = 'kupci_main'
                    root.manager.transition.direction = 'left'
            Button:
                text:"SOLD"
                on_release:
                    root.manager.transition.direction = 'left'
                    app.root.current = 'prodato'

            Button:
                text: "WORKERS"

            Button:
                text: "IN STOCK"

''')


class MainWindow(Screen):
    pass

class main_app(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainWindow())
        sm.add_widget(Kupci_main())
        sm.add_widget(Kupci_pretraga())
        sm.add_widget(Kupci_sve())
        sm.add_widget(Duznici())
        sm.add_widget(Prodato())
        return sm

if __name__ == '__main__':
    main_app().run()

以下是客户脚本:

from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
import csv
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput
from functools import partial


class Kupci_main(Screen):
    pass


class Kupci_sve(Screen):
    def __init__(self, **kwargs):
        super(Kupci_sve, self).__init__(**kwargs)
        self.csv_read()

    def button_release(self, index):
        print('button_release: ', index)
        if index == "MAIN MENU":
            self.manager.current = 'main'
            self.manager.transition.direction = 'right'
        if index != 'MAIN MENU':
            for i in glavna_lista:
                if index == i[2]:
                    search_popup(i[0], i[1], i[2], i[3], i[4])

    def csv_read(self):
        global glavna_lista
        self.ids.kupci_sve.data = []
        with open('prodato.csv', 'r', encoding='utf-8') as f:
            csv_ = csv.reader(f, delimiter=' ')
            glavna_lista = []
            for row in csv_:
                if len(row) != 0:
                    s = ' '.join(row)
                    lista = s.split(',')
                    glavna_lista.append(lista)
            glavna_lista = list(reversed(glavna_lista))
            content = ['MAIN MENU']
            for i in glavna_lista:
                if i[2] not in content:
                    content.append(i[2])
            self.ids.kupci_sve.data = [{'text': str(i), "on_release": partial(self.button_release, i)} for i in content]
            print(self.ids.kupci_sve.data)
            f.close()

    def test(self):
        self.ids.kupci_sve.data = []


class Kupci_pretraga(Screen):
    def __init__(self, **kwargs):
        global glavna_lista
        super(Kupci_pretraga, self).__init__(**kwargs)

    def search_ime_pib(self, ime_pib):
        if ime_pib != '':
            for i in range(len(glavna_lista)):
                if ime_pib.lower() in glavna_lista[i][2].lower():
                    search_popup(glavna_lista[i][0], glavna_lista[i][1], glavna_lista[i][2],
                                 glavna_lista[i][3], glavna_lista[i][4])
                if ime_pib.lower() in glavna_lista[i][3].lower():
                    search_popup(glavna_lista[i][0], glavna_lista[i][1], glavna_lista[i][2],
                                 glavna_lista[i][3], glavna_lista[i][4])

    pass


class Duznici(Screen):
    def __init__(self, **kwargs):
        super(Duznici, self).__init__(**kwargs)
        lista = ['MAIN MENU']
        for i in range(len(glavna_lista)):
            print(glavna_lista[i][4])
            placeno, cena = glavna_lista[i][4].split('/')
            placeno, cena = int(placeno), int(cena)
            if cena > placeno:
                s = ' '.join([glavna_lista[i][0], glavna_lista[i][1], glavna_lista[i][2],
                              glavna_lista[i][3], glavna_lista[i][4]])
                lista.append(s)

        self.ids.duznici.data = [{'text': (str(i)).strip('[]'), 'on_release': partial(self.button_release, i)} for i in
                                 lista]

    def button_release(self, index):
        print('button index: ', index)
        if index == 'MAIN MENU':
            self.manager.current = 'main'
            self.manager.transition.direction = 'right'
        if index != 'MAIN MENU':
            for i in glavna_lista:
                if index == i:
                    search_popup(i[0], i[1], i[2], i[3], i[4])

    pass


class Popup_kupci(FloatLayout):
    pass


def zapisi_promenu(datum, sta, ime, pib, odnos_cena_uplaceno, novi_datum, novo_sta, novo_ime, novi_pib, novo_placeno):
    if (novi_datum.text != datum and novi_datum.text != '') or (novo_sta.text != sta and novo_sta.text != '') \
            or (novo_ime.text != ime and novo_ime.text != '') \
            or (novo_placeno.text != odnos_cena_uplaceno and novo_placeno.text != '') \
            or (novi_pib.text != pib and novi_pib.text != ''):
        f = open('prodato.csv')
        csv_ = csv.reader(f, delimiter=' ')
        csv_lista = list(csv_)
        lista_w = []
        for row in reversed(csv_lista):
            if len(row) != 0:
                string = ' '.join(row)
                lista_raw = string.split(',')
                if (datum and sta.encode('utf-8') and ime.encode('utf-8') and pib and odnos_cena_uplaceno) in lista_raw:
                    if novi_datum.text != datum and novi_datum.text != '':
                        lista_raw[0] = novi_datum.text
                    if novo_sta.text != sta and novo_sta.text != '':
                        lista_raw[1] = novo_sta.text
                    if novo_ime.text != ime and novo_ime.text != '':
                        lista_raw[2] = novo_ime.text
                    if novi_pib.text != pib and novi_pib.text != '':
                        lista_raw[3] = novi_pib.text
                    if novo_placeno.text != odnos_cena_uplaceno and novo_placeno.text != '':
                        lista_raw[4] = novo_placeno.text
                    lista_w.append(lista_raw)
                else:
                    lista_w.append(lista_raw)
        f.close()
        f = open('prodato.csv', 'w')
        csv_writer = csv.writer(f)
        for i in lista_w:
            print(i)
            csv_writer.writerow(i)
        f.close()
        if novi_datum.text != datum and novi_datum.text != '':
            datum = novi_datum.text
        if novo_sta.text != sta and novo_sta.text != '':
            sta = novo_sta.text
        if novo_ime.text != ime and novo_ime.text != '':
            ime = novo_ime.text
        if novo_placeno.text != odnos_cena_uplaceno and novo_placeno.text != '':
            odnos_cena_uplaceno = novo_placeno.text
        if novi_pib.text != pib and novi_pib.text != '':
            pib = novi_pib.text


def obrisi(datum, sta, ime, pib, odnos_cena_uplaceno):
    f = open('prodato.csv')
    csv_ = csv.reader(f, delimiter=' ')
    csv_lista = list(csv_)
    lista_w = []
    for row in reversed(csv_lista):
        if len(row) != 0:
            string = ' '.join(row)
            lista_raw = string.split(',')
            lista_w.append(lista_raw)
            if (datum and sta.encode('utf-8') and ime.encode('utf-8') and pib and odnos_cena_uplaceno) in lista_raw:
                lista_w.remove(lista_raw)
    f.close()
    f = open('prodato.csv', 'w')
    csv_writer = csv.writer(f)
    for i in lista_w:
        print(i)
        csv_writer.writerow(i)
    f.close()


def promeni(datum, sta, ime, pib, odnos_cena_uplaceno):
    show = Popup_kupci()
    PopupWind = Popup(title='Change', content=show, size_hint=(None, None), size=(400, 400), auto_dismiss=False)
    show.add_widget(Label(text='Date: ', pos_hint={'x': 0.1, 'y': 0.8}, size_hint=(0.3, 0.1)))
    show.add_widget(Label(text='What: ', pos_hint={'x': 0.1, 'y': 0.7}, size_hint=(0.3, 0.1)))
    show.add_widget(Label(text='Name: ', pos_hint={'x': 0.1, 'y': 0.6}, size_hint=(0.3, 0.1)))
    show.add_widget(Label(text='Paid/Value: ', pos_hint={'x': 0.1, 'y': 0.5}, size_hint=(0.3, 0.1)))
    show.add_widget(Label(text='Pib: ', pos_hint={'x': 0.1, 'y': 0.4}, size_hint=(0.3, 0.1)))
    novi_datum = TextInput(pos_hint={'x': 0.4, 'y': 0.8}, size_hint=(0.4, 0.1), multiline=False)
    show.add_widget(novi_datum)
    novo_sta = TextInput(pos_hint={'x': 0.4, 'y': 0.7}, size_hint=(0.4, 0.1), multiline=False)
    show.add_widget(novo_sta)
    novo_ime = TextInput(pos_hint={'x': 0.4, 'y': 0.6}, size_hint=(0.4, 0.1), multiline=False)
    show.add_widget(novo_ime)
    novo_placeno = TextInput(pos_hint={'x': 0.4, 'y': 0.5}, size_hint=(0.4, 0.1), multiline=False)
    show.add_widget(novo_placeno)
    novi_pib = TextInput(pos_hint={'x': 0.4, 'y': 0.4}, size_hint=(0.4, 0.1), multiline=False)
    show.add_widget(novi_pib)
    show.add_widget(Button(text='Make a change', size_hint=(0.4, 0.15), pos_hint={'x': 0.5, 'y': 0.1},
                           on_press=PopupWind.dismiss, on_release=lambda x: zapisi_promenu(datum, sta, ime, pib,
                                                                                           odnos_cena_uplaceno,
                                                                                           novi_datum, novo_sta,
                                                                                           novo_ime, novi_pib,
                                                                                           novo_placeno)))
    show.add_widget(Button(text='Cancel change', size_hint=(0.4, 0.15), pos_hint={'x': 0.1, 'y': 0.1},
                           on_press=PopupWind.dismiss))
    PopupWind.open()


def search_popup(datum, sta, ime, pib, odnos_cena_placeno):
    show = Popup_kupci()
    PopupWind = Popup(title='Found', content=show, size_hint=(None, None), size=(400, 400), auto_dismiss=False)
    show.add_widget(Label(text=('{}\n\n{}\n\n{}\n\n{}\n\n{}'.format(datum, sta, ime, odnos_cena_placeno, pib)),
                          pos_hint={'x': 0.2, 'y': 0.5},
                          size_hint=(0.6, 0.2)))
    show.add_widget(Button(text='OK', size_hint=(0.4, 0.15), pos_hint={'x': 0.5, 'y': 0.1}, on_press=PopupWind.dismiss))
    show.add_widget(Button(text='Change', size_hint=(0.4, 0.15), pos_hint={'x': 0.1, 'y': 0.1},
                           on_press=PopupWind.dismiss,
                           on_release=lambda x: promeni(datum, sta, ime, pib, odnos_cena_placeno)))
    show.add_widget(
        Button(text='Delete', size_hint=(0.4, 0.1), pos_hint={'x': 0.3, 'y': 0}, on_press=PopupWind.dismiss,
               on_release=lambda x: obrisi(datum, sta, ime, pib, odnos_cena_placeno)))
    PopupWind.open()

    return 0


kv = Builder.load_string('''
<Kupci_main>:
    name: 'kupci_main'
    GridLayout:
        cols: 1
        rows: 3
        Button:
            text: 'ALL CUSTOMERS'
            on_release:
                app.root.current = 'kupci_sve'
        Button:
            text: 'SEARCH FOR CUSTOMER'
            on_release:
                app.root.current = 'kupci_pretraga'
        Button:
            text: "HAVEN'T PAID"
            on_release:
                app.root.current = 'duznici'

<Kupci_sve>:
    name: 'kupci_sve' 
    RecycleView:
        id: kupci_sve
        scroll_type: ['bars']
        bar_width: 8
        viewclass: 'Button'
        RecycleBoxLayout:
            default_size: (None, 100)
            default_size_hint: (1, None)
            size_hint_y: None
            height: self.minimum_height
            orientation: "vertical"

<Kupci_pretraga>:
    name: 'kupci_pretraga'
    FloatLayout:
        TextInput:
            id: trazeno
            size_hint: (0.5, 0.1)
            pos_hint: {"x": 0.25, "y": 0.33}
            text: 'input a name or pib...'
            on_touch_down:
                trazeno.text = ''

        Button:
            text: 'Search'
            size_hint: 0.2, 0.1
            pos_hint: {"x": 0.55, "y": 0.23}
            on_release:
                root.search_ime_pib(trazeno.text)
        Button:
            text: 'MAIN MENU'
            size_hint: 0.2, 0.1
            pos_hint: {"x": 0.55, 'y': 0.13}
            on_release:
                app.root.current = 'main'
                root.manager.transition.direction = 'right'
<Duznici>:
    name: 'duznici'
    RecycleView:
        id: duznici
        scroll_type: ['bars']
        bar_width: 8
        viewclass: 'Button'
        RecycleBoxLayout:
            default_size: (None, 100)
            default_size_hint: (1, None)
            size_hint_y: None
            height: self.minimum_height
            orientation: "vertical"
    ''')

以下是销售脚本:

from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.uix.popup import Popup
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
import csv
from customers import Kupci_sve


class Prodato(Screen):
    def pressed_btn(self, sta, kome, koliko, kada, pib, placeno, ukupna_cena):
        prodato_popup(sta, kome, koliko, kada, pib, placeno, ukupna_cena)

    pass


class Popup_(FloatLayout):
    pass


kv = Builder.load_string('''
<Prodato>:
    name: "prodato"
    GridLayout:
        rows:7
        GridLayout:
            cols:2
            Label:
                text: "what product?"
            TextInput:
                id: sta
                multiline:False
                write_tab: False
        GridLayout:
            cols:2
            Label:
                text: "to who?"
            TextInput:
                id: kome
                multiline:True
                write_tab: False
        GridLayout:
            cols:2
            Label:
                text: "how much is sold?"
            TextInput:
                id: koliko
                multiline: False
                write_tab: False
        GridLayout:
            cols:2
            Label:
                text: "when?"
            TextInput:
                id:kada
                multiline: False
                write_tab: False
        GridLayout:
            cols: 4
            Label:
                text: 'paid: '
            TextInput:
                id: placeno
                multiline: False
                write_tab: False
            Label:
                text: 'value: '
            TextInput:
                id: ukupna_cena
                multiline: False
                write_tab: False
        GridLayout:
            cols:2
            Label:
                text: "PIB? "
            TextInput:
                id:pib
                multiline: False
                write_tab: False
        GridLayout:
            cols:2
            Button:
                text: "MAIN MENU"
                on_release:
                    app.root.current = "main"
                    root.manager.transition.direction = "right"
                    sta.text, kome.text, koliko.text, kada.text, pib.text, placeno.text, ukupna_cena.text = '','','','','','',''

            Button:
                text: "CHECK"
                on_release:
                    root.pressed_btn(sta.text, kome.text, koliko.text, kada.text, pib.text, placeno.text, ukupna_cena.text)



''')


def prodato_popup(sta, kome, koliko, kada, pib, placeno, ukupna_cena):
    show = Popup_()
    PopupWind = Popup(title='Provera', content=show, size_hint=(None, None), size=(400, 400), auto_dismiss=False)
    if sta != "" and kome != "" and koliko != "" and kada != "" and pib != "":
        show.add_widget(Label(font_size=17,
                              text=("What: {}\n\nTo who: {}\n\nHow much: {}\n\nDate: {}\n\nPaid: {}/{}\n\nPib: {}".format(
                                  sta.strip(), kome.strip(),
                                  koliko.strip(), kada.strip(),
                                  placeno.strip(), ukupna_cena.strip(),
                                  pib.strip())),
                              pos_hint={"x": 0.2, "y": 0.5}, size_hint=(0.6, 0.2)))
        potvrdi = Button(text="SUBMIT", size_hint=(0.4, 0.15), pos_hint={'x': 0.5, "y": 0.1},
                         on_release=PopupWind.dismiss, on_press=lambda x: prodato_csv(sta.upper(), kome.upper(),
                                                                                      koliko, kada, pib,
                                                                                      placeno, ukupna_cena))
        potvrdi.bind(on_release=lambda x: Kupci_sve().csv_read())

        show.add_widget(potvrdi)
        show.add_widget(
            Button(text="CANCEL", size_hint=(0.4, 0.15), pos_hint={"x": 0.1, "y": 0.1}, on_release=PopupWind.dismiss))
    else:
        show.add_widget(Label(font_size=20, text="You need to enter everything.",
                              pos_hint={"x": 0.2, "y": 0.5}, size_hint=(0.6, 0.2)))
        show.add_widget(
            Button(text="OK", size_hint=(0.8, 0.3), pos_hint={"x": 0.1, "y": 0.1}, on_release=PopupWind.dismiss))
    PopupWind.open()


def prodato_csv(sta, kome, koliko, kada, pib, placeno, ukupna_cena):
    with open('prodato.csv', 'a', encoding='utf-8') as f:
        csvwriter = csv.writer(f)
        lista = [kada, sta, kome, pib, str(placeno) + '/' + str(ukupna_cena)]
        csvwriter.writerow(lista)  # [kada, sta.encode('utf-8'), koliko, kome.encode('utf-8'), pib]
        print('writerow')
        f.close()
    pass

Tags: csvtextselfaddsizeifhintlista