Daha çox

Arcpy - time.localtime () istifadə edərək sahələrin yenilənməsi


Məqsədim, "DATE_IMPOR" sahəsindəki dəyərləri time.localtime funksiyasından istifadə edərək cari saata təyin etməkdir. Oraya çatanda bəzi problemlərlə qarşılaşıram, hər şeydən əvvəl, bir satır ən problemli görünür "row.setValue (" DATE_IMPOR ", new_time)".

"DATE_IMPOR" sahə məlumat növü Tarixdir, buna görə də YYYY və ya YYYY/AA/GG və ya dəstəklənən növlər kimi Tarix formatı olmalıdır.

Bir sözlə, əldə etdiyim bir İşləmə Səhvidir.

İndiyə qədər yazdığım ssenari budur:

arcpy idxal vaxtı #environnement de travail arcpy.env.workspace = "D:/M1 Geomatique/Programration II/Dossier" cursor = arcpy.UpdateCursor ("ZONE_INONDATION_SYNTHESE_67.shp", "DATE_IMPOR c" üçün) imleç: new_time = time.localtime () [0] row.setValue ("DATE_IMPOR", new_time) cursor.updateRow () istisna olmaqla: arcpy.GetMessages ()

*Bir qeyd: Bu sualı haradan verməyin daha yaxşı olacağından əmin deyildim, buna görə də bura yerləşdirdim. Bunun üçün üzr istəyir.


Sonda bir həll tapmağı bacardım.

Birincisi, for döngüsünün yerinə yetirilmə üsulunu dəyişdirdim, belə bir şərtlə şərt qoydum.DATE_IMPOR nə axtarmaq lazım olduğunu bilir, bu halda onu (Yox) olaraq keçdiyim idi.

məs.əgər satır.DATE_IMPOR == Heç biri: satır.DATE_IMPOR = vaxt.strftime ('%d/%m/%Y') cursor.updateRow (satır)

Time.localtime () sizə tuplar verdiyinə görə məlumatları düzgün formata gətirmək üçün başqa bir döngəyə ehtiyacım olacağını başa düşdüyüm üçün localtime () istifadə etmədim.

Düşünsəniz, bu yol daha qısa, təsirli və daha təhlükəsiz idi.


Əvvəlcə qeyd edim ki, demək olar ki, həmişə seçim etməlisiniz Konkret bir tətbiq üzərində interfeys. Konkret tətbiq yalnız 1 yerdə istifadə edilməlidir. Bir nümunənin əslində yaradıldığı yer budur. Bunu bir neçə yerdə düzgün etdiniz:

Bir ArrayList yaradırsınız və Siyahıda saxlayırsınız, Siyahı olaraq qaytarırsınız və Siyahı kimi idarə edirsiniz. Bu yaxşıdır. Ancaq bunu bütün Siyahılarınız, Setləriniz və bəlkə də başqa şeylər üçün etməlisiniz.

Səhv etdiyiniz nümunələr:
şəxsi ArrayList & ltRent & gt rentedBooks -> özəl Siyahı & ltRent & gt rentedBooks
xüsusi statik HashSet & ltUser & gt istifadəçiləri -> Set & ltUser & gt
xüsusi statik HashSet & ltCustomer & gt müştəriləri -> Müştəri & gt
.
bir neçəsinin adını çəkmək. (alıcılar/quranlar da daxildir).

Dəyişməyən dəyişkəndən daha yaxşıdır. Bəzi siniflər üçün sahələrdən birini dəyişdirməyin heç bir mənası yoxdur. Məsələn bir BookTitle götürün. Bir kitabın adının birdən -birə dəyişdiyini heç vaxt bilməmişəm. Beləliklə, bu sahələri son olaraq dəyişdirin və quranları çıxarın:

Eyni şey Kitab, Müəllif, Kirayə, İstifadəçi Qeydiyyatı, üçün də edilə bilər.

Bunun bəzi təsirləri olsa da. Kirayəni dəyişməz etsəniz, kirayəni hər dəfə "yeniləmək" istədiyiniz zaman (qaytarılma tarixini bir həftə uzatmaq kimi) köhnə kirayəni əvəz etmək üçün yeni bir kirayə yaratmalı olacaqsınız. Alternativ olaraq kirayə müddətini dəyişkən saxlaya və ya bunun üçün xüsusi bir extensionByAWeek () metodu təqdim edə bilərsiniz.

Bəzən dəyişənlərin dəyişməsi daha məntiqlidir. Kirayə müddəti və ya bir istifadəçinin e -poçtu və ünvanı kimi (insanlar zaman -zaman hərəkət edir və ya e -poçt ünvanlarını dəyişirlər). Bəzi purists yenə də obyektləri dəyişməz hala gətirər, həmişə yenilənmiş dəyərlə yeni bir nümunə yaradar və bütün nümunələri əvəz edərdi. Ancaq düşünürəm ki, bu, çox çətinliklərdir. Dəyişməz obyektlərdən başlayardım və dəyər dəyişikliyinə sahib olmağın nə qədər məntiqli olduğu (məsələn, istifadəçinin hərəkət etdiyi zaman) qurucunu və ya digər yeniləmə metodunu təmin edərdim.

Başqa bir faydalı prinsipdir YAGNI. Hansı ki, "Ehtiyacınız yoxdur" deməkdir. Proqramınız hələ faydalı bir şey etmədiyi üçün bu məlumat quruluşlarından hansına ehtiyacınız olacağını və hansının olmadığını söyləmək çətindir. Bu səbəbdən cr.se saytında sualınıza ilk cavablar bunlardır: bunun nəyə lazımdır?

Nə lazım olduğunu bilmədiyiniz müddətcə, hələ tətbiq etməməlisiniz. Admin sinifinə ehtiyacınız olacağına əminsinizmi? Proqramın yalnız adminlər tərəfindən istifadə ediləcəyinə sonra qərar verərsənsə və ehtiyac duyduğun tək şey onların giriş adıdır (və onların olduğundan əmin olmaq üçün parol). Bu o deməkdir ki, ilk növbədə Admin/Müştəri/İstifadəçi olaraq ayrılmağa ehtiyacınız yox idi. İstifadəçiləriniz (proqramdan) və hər biri öz məlumatları olan 2 fərqli şey olan Müştəriləriniz olardı.

Yalnız məlumat üçün: Mövcud proqramınızdakı bir Administratorda UserPrivilige.ADMIN yoxdur. Bəs o UserPriviliges sizin üçün nə edir?

Seçdiyiniz dərslərə gəlincə. Mənim üçün bir istifadəçinin kirayə götürdüyü kitabları izləməkdən məsul olması məntiqli deyil. Mövcud proqramınız hələ çox iş görmür, buna görə kirayə evlərini izləmək üçün ən yaxşı yer olduğunu söyləmək çətindir. Proqramınızla bundan sonra nə etməyi planlaşdırdığınızdan asılı olaraq burada təklif edəcəyim şeylə ziddiyyət təşkil edə bilər. Buna görə də bunu "bunu belə etməlisən" kimi qəbul etməyin. Bunun əvəzinə bəzi şeyləri necə və niyə seçdiyimə baxın və öz proqramınızı təkmilləşdirmək üçün sizə ilham verin.

Xüsusi kitabları ümumi bir kitab başlığı ilə ayırdınız. Bir kitabxananın eyni kitab başlığının birdən çox olması qeyri -adi bir şey deyil və hansını kirayələdiyinizə əhəmiyyət vermirsiniz. Bir kitab başlığına baxmaq və kitabın xüsusi bir nüsxəsini icarəyə götürmək məntiqlidir.

Alternativ olaraq, yalnız Kitablara (indiki BookTiltes) sahib olmaq və nə qədər sahibinizin və ya kimin rant etdiyini izləmək olardı. a kitabın surəti. Bu alternativə bir az üstünlük verirəm çünki fərdi nüsxələrə əhəmiyyət vermirsən.

Düşündüyüm ən böyük dəyişiklik kimin hansı kitabın kirayəyə götürüldüyünü izləməsidir?

Hal -hazırda sahib olduğu kitabları izləyən bir Müştəriniz var. Bir Kitabı Müştəriyə və kitabın nə vaxt qaytarılmalı olduğunu göstərən bir Kirayə sinifiniz var. Hal -hazırda heç bir əlavə dəyər əlavə etmədiyi üçün List & ltBook kimi ola biləcək bir BookDirectory var. Və bir az yersiz hiss edən digər siniflər.

Kitabxanaya aid olan bütün kitabların siyahısını ehtiva edən bir Kitabxana sinfi yoxdur. Beləliklə, hazırda əsas metodunuz bunları izləyir.

Fikrim əvvəlcə bu Kitabxana sinifini yaratmaqdır. Kirayədə olan kitabların və neçə kitabın mövcud olduğunu izləyən bir xəritə var. (Alternativ olaraq, Book+BookTitle ilə qalmaq istəyirsinizsə, bu, konkret mövcud nüsxələrə bir başlıq eşleyen Map & ltBookTitle, Set & ltBook & gt & gt olacaq.)

Mövcud kitablardan başqa, bu sinif açıq olan bütün kirayələrin siyahısını da saxlayır. Bu yolla, hansı kitabların tezliklə geri qaytarılması lazım olduğunu araşdırmaq üçün mərkəzi bir yerimiz var (bunları tapmaq üçün sistemdəki bütün istifadəçilərə yöndəmsiz bir şəkildə keçmək əvəzinə) və bundan istifadə edərək bir kitabın nüsxəsi hansı istifadəçilərdə olduğunu tapmaq üçün də istifadə edə bilərik. əlçatan yoxdur. Bir Müştəriyə söyləmək faydalı ola bilər: sabah qayıdın, John Smith o vaxta qədər surətini geri gətirmiş olacaq.

İndi Müştəri sinfi artıq bu müştərinin kitablarını izləməyə ehtiyac duymur. Bir kitabı geri qaytarsanız, kitabxanaçı ümumiyyətlə hansı kitabı geri qaytardığınızı öyrənmək üçün tarar (sistemdə düzgün şəxsiyyət vəsiqəsi ilə və s.). İndi bu, Kitabxana sinifində, istifadəçi və kitabın birləşməsi ilə Kirayəni silmək və mövcud kitabların xəritəsindəki kitab sayını artırmaq üçün returnBook (Müştəri müştəri, Kitab kitabı) kimi bir üsulla işlənməlidir. Alternativ olaraq bu siyahını Müştəridə saxlaya bilərsiniz. Bir kitabı qaytardığınız zaman onu müştəridən götürüb yenidən kitabxanaya əlavə etməyiniz məntiqdir. Bu, "bu müştərinin hazırda hansı kitablara sahib olduğunu" öyrənməyi asanlaşdırır. (Yenə də burada seçim proqramınızın nə etməli olduğuna bağlıdır).

YAGNI hissəsində göstərildiyi kimi. Yəqin ki, Admin və ya İstifadəçi siniflərinə ehtiyacınız yoxdur. Lazımi sahələri olan yalnız Müştəri ilə başlayın. Və daha sonra həm Müştəri, həm də İstifadəçini ümumi bir Şəxsə birləşdirmək istədiyinizə baxın. Ancaq sonra alt sinfi (Müştəri) super sinfə (Şəxs) dəyişdirmək istədiyiniz yerə də baxın. Bunun bir çox yerdə baş verəcəyinə şübhə edirəm, çünki proqram içərisində həmişə Müştəri kitablarını kirayəyə götürəcəksiniz.

Bu da UserRegistration sinifinizə təsir edir. Əslində bu sinif özü çox qəribədir. Bu sinifin necə görünəcəyini gözləyirdim:

Ən diqqətçəkən ad/e -poçt/şifrə üçün sahələrin olmamasıdır. Müştəri ilə nə etmək istədiyinizə görə dəqiq tətbiq dəyişə bilər (şifrəni sildiyim kimi).

İlk düşüncəm, sistemdən özləri istifadə etmələrinə icazə verməməkdir. Kitabları geri qaytarmaq/yoxlamaq üçün bir kitabxanaçı girişi olsun.

Ümid edirəm izahım, proqramınızın nə etməli və etməməyinizə qərar verməyinizə kömək edəcək. Bildiyiniz niyyət olmadan bir proqram haqqında məsləhət vermək çətindir)


2 Cavab 2

Bunu çalışdığınız şəkildə edə bilməzsiniz, çünki time.sleep bütün tətbiqi bloklayacaq və kilidləyəcək. ArcGIS -dəki Python əlavələri olduqca yeni bir şeydir və hələ tətbiq olunmamış bir çox funksiya var. Bunlardan biri .NET və ArcObjects -ə daxil olduğunuz kimi bir növ yeniləmə və ya taymer hadisəsidir. Belə bir vəziyyətdə threading.Thread və threading.Event istifadə etməyi düşünə bilərsiniz, ancaq Python addin mühitində mövzu ilə əlaqəli heç bir şey işləməyəcək. Ən azından işə düzəldə bilmirəm. Belə vəziyyətlərdə etdiyim şey wxPython və Timer sinifindən istifadə etməkdir. Əlavənin düzgün qurulması halında aşağıdakı kod işləyəcək.

Bir alət çubuğu və düymə sinfi ilə bir uzantı əlavə edin. Yuxarıda göstərildiyi kimi uzantının başlanğıc metodunu ləğv edin. Bu zamanlayıcı ilə bir Frame alt sinifinin bir nümunəsini yaradacaq. Sonra, alətlər çubuğundakı düyməni hər dəfə tıkladığınız zaman, taymer açılacaq və ya sönəcək. Taymer arqumenti milisaniyələr içərisindədir, buna görə də göstərildiyi kimi kod hər 5 saniyədə bir yenilənir.

Əlavələrdə wxPython istifadə etmək haqqında daha çox məlumatı buradan oxuya bilərsiniz. Çap bəyanatının işləməməsi kimi MCederholmun yazılarına xüsusi diqqət yetirin.

Kod, addin uzadılması sinifinin bir başlanğıc üsulunu ləğv edir. Bu metodun Arcmap başladığı zaman işə salınması nəzərdə tutulur, ancaq şərhlərinizdən görünür ki, bu başlanğıc metodu başlanğıcda işləmir. Əlavənizi düzgün yaratmasanız bu mümkündür, amma testlərimdə mənim üçün yaxşı işləyir. "AttributeError: 'NoneType' obyektində 'timer' atributu yoxdur 'almağa davam edirsinizsə, düymə sinifinizin onClick metodunu belə dəyişdirin:

İlk 3 sətir, WATCHER dəyişəninin watcherDialog nümunəsinə qurulduğunu və hələ də Yox olaraq təyin edilmədiyini yoxlayır. Başlanğıc metodunuzun niyə işləmədiyini bilmirəm, amma inşallah bu sizin üçün hər şeyi düzəldər.


5 Cavablar 5

Stat () nəticələrini şərh etmək və dövrdən bir datetime çevirmək üçün stat modulundan istifadə edərək bundan faydalı bir şey əldə edə bilərsiniz:

Bu, cari qovluğa son dəfə daxil edildiyini göstərən bir datetime obyektini çap edir:

ctime - sonuncu dəfə fayl girişi dəyişdirildi (məsələn, icazələr dəyişdirildi, faylın adı dəyişdirildi və s.)
mtime - son dəfə fayl MÜNDƏRİCATI dəyişdirildi
atime - son dəfə fayla daxil olmaq.

Nömrələr sadəcə unix zaman damgalarıdır - 1 Yanvar 1970 -ci ildən başlayaraq saniyələri təmsil edən 32 bitlik ints dövrü.

Və bəli, daha kiçik ədədlər = vaxtın əvvəlində.

Qeyd: St_atime, st_mtime və st_ctime atributlarının dəqiq mənası və həlli əməliyyat sistemindən və fayl sistemindən asılıdır. Məsələn, FAT və ya FAT32 fayl sistemlərindən istifadə edən Windows sistemlərində st_mtime 2 saniyəlik, st_atime yalnız 1 günlük qətnaməyə malikdir. Ətraflı məlumat üçün əməliyyat sistem sənədlərinizə baxın.

Linux üçün bu sistem sənədləri stat (2) manpage:

zaman vaxtının insan vaxtında təyin olunduğu yer (2):

Dövrdən bəri saniyə və nanosaniyələri göstərir.

burada UNIX dövrü olduğu dövrdür. Dəyər nə qədər yüksəkdirsə, o dövrdən (1 Yanvar 1970, gecə yarısı UTC) sonra daha çox vaxt keçir.

Python vaxt modulu eyni şəkildə vaxt aparır və datetime modulu belə bir dəyərdən datetime obyekti verəcək sinif metodlarına malikdir:

Yuxarıda gördüyünüz kimi, üç sahə müvafiq olaraq giriş vaxtını, dəyişdirmə müddətini və status dəyişmə müddətini təmsil edir.


2 Cavab 2

If bəndindən sonra bəzi girintilərlə və iki nöqtə ilə daha yaxşı işləyəcək. Həmçinin if ifadəniz heç vaxt doğru ola bilməz. Məntiqim deyir ki, vaxt səhər 5 -dən axşam 6 -dək deyilsə, işığı yanıb sönün (yəni gecə yarısından səhər 5 -ə və ya 18 -dən gecə yarısına qədər olacaq).

Birincisi, heç bir funksiya vaxtı yoxdur.hour (n). Yerli vaxtda cari saatı əldə etmək üçün istifadə edin

Sonra, bu kodun 6 -dan 5 -ə qədər aktiv olmasını istəyirsən, buna görə də saat & lt 5 və ya> = 18 olmalıdır. Beləliklə, doğru xətt budur:

Pythonda & amp & amp və ya || yoxdur , bu söz olaraq yazılmışdır.

Bununla kodunuz gecə işləyəcək və LED -i yanıb -sönəcək, amma yenə də bir qüsuru var. Gündüz vaxtı, halqa fasiləsiz olaraq dəfələrlə yerinə yetiriləcək və 100% CPU yükünə səbəb olacaq. Daha çox yuxu əlavə etməklə bunun qarşısını almaq olar:


2 Cavab 2

Bir shell skript ilə bunu çox asanlıqla edə bilərsiniz:

Həqiqətən python istifadə etmək istəyirsinizsə:

Problem subprocess.call əmrinin tamamlanmasını gözləyir.

Bunun əvəzinə subprocess.Popen istifadə etmək olar

Bu, ps əmrinin qarşısını almaqla yanaşı əmrin bitməsini gözləməməyin əlavə üstünlüyünə malikdir.

Leniklə razılaşmalıyam, ssenarinin uğursuz olmamasını təmin etmək həqiqətən daha yaxşıdır, orada kömək istədiyiniz bir problem varmı?

Nəhayət, qeyd faylını niyə əlavə rejimində açırsınız, ancaq yazma mövqeyini dərhal faylın başlanğıcına köçürürsünüzsə, əlavə edən bir qeyd və ya son bir mesaj qeydini istəyirdinizmi?


Pi Kamera dalğalı video/atlanan çərçivələr

Bir IR fasilə şüa sensoru tərəfindən tetiklenen 30 saniyəlik görüntüləri qeyd etmək üçün Pi kamerasından istifadə edirəm. Bu Pi 3 B+üzərində işləyir. Adafruit Perma-Proto Pi Şapkasından istifadə edərək bütün naqilləri lehimləmişəm. Mənim problemim odur ki, bir məqamda bir səsi tətikləyəndə qeyri -müəyyən bir video çəkməyə başladım və həyatım boyu onu nəyi dəyişdiyini anlaya bilmirəm. Həftələr boyu mükəmməl yazılırdı. İndi görünür ki, videonun işlənməsi üçün tampon qeydə başladıqdan bir müddət sonra tükənir və bu səbəbdən çərçivələri atmağa başlayır (yalnız bir təxmin). Problemi həll etməyə çalışdığım şeylər bunlardır:

  1. GPU yaddaşının artması
  2. Video qətnaməsinin azalması
  3. Fərqli pi -də proqram işləyir
  4. Fərqli proto pi şapka ilə çalışan proqram
  5. Proto pi şapka yerinə çörək taxtası istifadə etməyə qayıdırıq
  6. Fərqli bir pi kamerası sınanır

Bir hardware problemi olmadığından əmin olmaq üçün əlimdən gələni etdiyimi düşünürəm. Raspian -ı tamamilə yenidən qurmamaq üçün çalışıram, amma ehtiyac olarsa bunu etməyə hazıram. Başqasının bənzər bir problemi və ya problemimin həlli üçün bir təklifi varmı?


Qeyri -adi və nizamsız cədvəllər

Cron hər şey çox sadə bir planlaşdırıcı hesab olunur və sintaksis idarəçiyə bir az daha qeyri -adi cədvəllər tərtib etməyə imkan vermir.

Ümumiyyətlə izah ediləcək aşağıdakı işi nəzərdən keçirin & quotu hər 5 dəqiqədə bir işə salın & quot:

hansı etmir həmişə hər 7 dəqiqədə bir əmr işlədin.

Unutmayın ki, / xarakteri bir addım təqdim etmək üçün istifadə oluna bilər, lakin addımlar bir seriyanın sonundan kənara çıxmır, məsələn. */7, hər 7 dəqiqədə 0-59 dəqiqədən, yəni 0,7,14,21,28,35,42,49,56 dəqiqəyə uyğun gəlir bir saat ilə digər arasında olacaq partiyalar arasında cəmi 4 dəqiqə, 00: 56 -dan sonra yeni seriya 01:00, 01:07 və s. (və partiyalar 01:03, 01:10, 01:17 və s.)


Nümunə Fayl

Bir az daha ətraflı:

Burada bir parikulyar iş müxtəlif mərhələlərdən keçir (JOB_NEW, JOB_START, JOB_START_ACCEPT, JOB_EXECUTE, JOB_STATUS). İndi paricluar bir iş nömrəsi üçün bütün sətirləri tapmaq istəyirəm. Məsələn, iş nömrəsi "84" olan bir iş tapmaq istəyirsinizsə, aşağıdakı çıxışı göstərməlidir:

Burada bir əsas məqam iş idinin 3 -cü sütunda göründüyüdür (sayı 0 -dan başlayır).

Qısa kontekst: İşləri idarə etmək və ya toplu iş prosesini idarə etmək üçün istifadə olunan və hər bir işi yuxarıda müəyyən edildiyi kimi bəzi İş detalları olan bir İş ID ilə qeyd edən bir daxili alətimiz var, buna görə də bir işin tam xronologiyasını ehtiva edir. Başlanmış və ya icra edilmiş bir hadisə faylı şəklində vaxtında işlədilir, lakin işləmə, iş nömrəsi ilə işinin vəziyyətini görmək üçün bir istifadəçi tərəfindən verilə bilər.


HPLC nasoslarını işə salmaq üçün Tkinter GUI, real vaxt məlumat vizualizasiyası

İşim üçün bəzi HPLC nasoslarını işə salmaq üçün GUI yazmaq üçün Tkinter istifadə etdim. Tətbiq nasoslara seriyalı bağlantılar vasitəsilə bəzi mesajlar göndərir, cavabı oxuyur, sonra məlumatları csv faylına daxil edir.

Məlumatları real vaxtda tərtib etmək və istifadəçiyə eyni anda bir neçə məlumat dəsti qurmaq üçün Matplotlib -dən istifadə edirəm.

Bu, əsasən iş yerində boş vaxtımda etdiyim şəxsi bir layihədir, amma bundan yaxşı təcrübələr öyrənmək təcrübəsi yaratmağa çalışıram. Başqa heç kim bu kodu inkişaf etdirmək niyyətində deyil, amma bunu bir gün bir növ portfelə daxil edə biləcəyim üçün paylaşıla bilən bir standartla yazmağa çalışıram.

Artıq bir və ya iki istisna olmaqla, kodu PEP8 -ə qədər düzəltmişəm.

Necə istifadə olunur

Tipik iş axını, məlumatları qeyd edərkən və görselleştirirken bir test və afk başlamaqdır. Bəzən müqayisə üçün bir neçə məlumat dəsti qurmağı sevirəm. Menyu çubuğu> yeni süjet funksiyası etmək mənə bunu etməyə imkan verir. Plotter pəncərəsi, süjet əfsanəsində istifadə etmək üçün fayl yollarını və başlıqları götürür. Eyni süjeti tez -tez (və ya onun versiyalarını) hazırladığım üçün həmin fayl yollarını və başlıqlarını (şəklin özündən çox) saxlaya bilmək faydalıdır. Bunu ".plt" faylının siyahısını seçərək, sonradan plotter pəncərəsini yenidən doldurmaq üçün aça bilərəm.

Mən bu proqramı istifadə edən tək adamam, amma onu elə qurmağa çalışıram ki, başqaları mənim iş funksiyamı öyrənsinlər və bundan da istifadə etsinlər. Bu məqsədlə onu gözəl və intuitiv etməyə çalışıram.

Avadanlıqları bağlamadığınız üçün bəzi düymələr işləməyəcək, ancaq tətbiqin çoxu istehsal üçün əlçatan olmalıdır.

Əsas narahat etdiyim sahələr

  • Oxunaqlılıq
    • Kodu yazdım, amma yenə də bəzi yerlərdə gözlərimi ağrıyır. - nə etsin?
    • UI elementləri və məntiq elementləri bir növ qarışıqdır - nə edir? kütləvi bir tətbiq deyil, amma əksər kod xətləri GUI elementləri qurur
    • İstifadəçi interfeysi və məntiqini daha çox ayırmaq istərdim, amma bu ölçülü bir layihə üçün "astronavt memarlığı" nın necə olacağını bilmirəm.
    • Self.foo -dan çox istifadə edib -etmədiyimə əmin deyiləm
    • Buradakı kimi obyektləri miras aldığım və onlardan istifadə etdiyimin səhv olduğunu hiss edə bilmərəm
    • məs. Bu işin mənasını tam anlamıram
    • kod hazırda yalnız Windows maşınları üçün mövcud olan Winsounds modulundan idxal edir :(
    • bir fayl paketləri üçün başlanğıc vaxtı (və fayl ölçüsü) əlavə modul idxalı ilə sürətlə böyüyür. python -dan bu şəkildə istifadə edilə bilən faylları pis bir tətbiq etmək üçün istifadə edirsiniz?
    • Başqasının bu faylı kompüterinə ata bilməsini istəyirəm və "işləyir"

    Kodun düzeni

    • core.py giriş nöqtəsidir
      • idxal sonra MainWindow nümunəsini yaradır
      • MainWindow -da etdiyimiz bir bloklama döngəsini idarə etmək üçün thread_pool_execut atributuna malikdir
      • idxal sonra MenuBar nümunəsini yaradır
      • istifadəçi girişi / məlumat vizuallaşdırılması üçün bəzi tkinter vidjetləri var
      • MainWindow üçün menyu
      • istifadəçiyə layihə qovluğunu təyin etməyə imkan verir
      • Plotter obyekti yarada bilər (yeni tkinter toplevel)
      • bir dəstə SeriesEntry obyekti idxal edir və edir (müştəri tkinter widgetı)
      • SeriesEntry obyektlərinin məzmununu duzlaya/aça bilər
      • csv faylları və hansı məlumat sütununun qurulacağını seçmək üçün xüsusi tkinter widgetı

      Kod

      Çizmə xüsusiyyətini sınamaq istəyirsinizsə, demo/sample_data repo qovluğunda bəzi nümunə csv məlumatları var.


      Videoya baxın: 3D GIS: 3D Analysis Tools and Visualization with ArcGIS (Oktyabr 2021).