Dobrý deň, potreboval by som poradiť. Pracujem na programe na tvorbu faktúr a potrebujem data v elemente Text usporiadať do tabuľky, ale nikde som nenašiel žiadnu funkciu ani iný spôsob ako to urobiť.
Fórum › Python
Tabulka v pythone
To Lucius : dvojrozmerne pole, nebo v pythonu spis dvourozmerny seznam :D
>>> prvniradek=['1.bunka','2.bunka']
>>> druhyradek=['1.bunka','2.bunka']
>>> tabulka=[prvniradek,druhyradek]
>>> prvniradek
['1.bunka', '2.bunka']
>>> druhyradek
['1.bunka', '2.bunka']
>>> tabulka
[['1.bunka', '2.bunka'], ['1.bunka', '2.bunka']]
na vykresleni si muzez neco napsat, mozna neco je i v zakladni distribuci, nebo neco najdes, googluj :)
To Lucius : tak určitě s těmi seznamy to je jasný, na to vykresleni něco napsat, nebo se zaměřit na Tkinter.
To Lucius : no přímo tam na to funkce není to by jich bylo strašně mnoho, ale dá se to udělat pomocí jiných funkcí.
Tak třeba pomocí Frame se dá vytvořit tabulka viz. http://tkinter.programujte.com/frame.htm,
nebo pro potřeby tvé fakruty se dá použít i udělátko LabelFrame viz. http://tkinter.programujte.com/labelframe.htm.
Optimální asi bude když postavíš celý projekt na Tkinteru, a to tak, že hlavní skupiny položek formuláře uděláš pomocí labelframe, tabulky pomocí label (popřípadě message) a frame.
Každopádně vše co potřebuješ najdeš na http://tkinter.programujte.com/. Když si s něčím nebudeš vědět rady, tak se zeptáš. :smile2:
To Lucius : Proč by si chtěl Label vkládat do textu. Buď použiješ jedno nebo druhý. Na to vytištění uděláš nějakou funkci print.
To Lucius : no to není ale můžeš si ji vykreslit třeba pomocí Livewires, nebo na to napsat nějakou jinou funkci. Nebo se dá použít vlastnosti udělátka Text.
Asi takhle:
Nejěkému textu přiřadíš tág a pak pomocí tag_config nastavíš vlastnosti. Ty budeš potřebovat lmargin, rmargin
To Lucius :
např.:
text.tag_config("n", background="yellow", foreground="red", font="Arial 20")
text.tag_config("a", foreground="blue")
text.insert(END, "ahoj", ("n", "a"))
výsledkem bude modrý text na žlutém pozadí
n,a - jsou tágy na jeden text můžeš použít víc tágů, ale platí, že ten poslední přepíše předchozí!!!
To Lucius : Tak ty závorky jsou tam proto, že Entry vrací typ Dict.
Odstranění je jednoduché:
zadane_hodnoty={"ahoj", "jak","se","vede"} #to je to co získáš skrze Entry, to ulož do nějaké proměné
x=0
for i in zadane_hodnoty:
print zadane_hodnoty[x], " ",
x=x+1
Závorky už by tam být neměly, hlavně musíš mít na konci toho řádku s print čárku. Ta je tam proto, aby se to vypisovalo na jeden řádek a ne pod sebe a to určitě nechceš.
To Lucius : tak mi ještě tak napadá, nakreslit si někde tabulku, a pak jí vložit jako obrázek na pozadí.
To Lucius : http://tkinter.programujte.com/photoimage.htm jukni se sem tam to máš všechno.
To Lucius : S tabulkama je to v Tkinter horší. Často je třeba nějaký dodatečný modul. Bez angličtiny to nepůjde: http://tkinter.unpythonic.net/wiki/FindPage?action=titlesearch&value=table - kromě prvního a posledního snad vše....
To Lucius : tak ho dej jako pozadí a pak to napozicuj do těch buněk
To Lucius : hmm tak to vidím jednoduše udělat do třeba v Delphi, nebo VB. Tohle přidáší akorát tak komplikace.
Pokud si věříš, řešení vždy existuje. Napadá mě například udělat si vlastní komponentu Text, která by umožňovala vkládání tabulek, Založená by byla na Canvasu.
Nicméně by to asi nebylo nic jednoduchého...
PS:
popřípadě je toto taky možnost:
|---------------|
|Já jsem tabulka|
|_______________|
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
from Tkinter import *
import random
root=Tk()
text=Text()
text.pack()
text.insert(END, "ahoj, ")
text.insert(END, "svete\n")
for radek in range(10):
for sloupec in range(10):
cislo=random.random()*10
bunka = Label(text, text="%6.2f" % cislo)
text.window_create(END, window=bunka)
text.insert(END,"\n")
mainloop()
;-)
To selkir : myslis prerobit cely program v Delphi alebo VB? ak ano, tak to uz v tejto faze neprichadza do uvahy
inak všetkým ďakujem za príspevky, ale stále to nie je to, čo potrebujem... ja potrebujem ten text proste orámovať, tak ako je klasická tabuľka v exceli
To Blujacker : taky mě napadlo si udělat vlastní nástroj, ale to je docela dosti práce a já nevím jak na tom Lucius je.
no díval jsem se do dokumentace Tkinteru, ale nic smysluplného jsem nenašel, takže asi jiné řešení nebude
tohle nebude asi to prave orechove http://freefiles.ic.cz/python/table/
To Lucius :
Popř, pokud je tvuj projekt POUZE pro windows, mohl by jsi použít knihovnu wxPython...
import wx
if wx.Platform == '__WXMSW__':
import wx.lib.iewin as iewin
#----------------------------------------------------------------------
class TestPanel(wx.Panel):
def __init__(self, frame=None):
wx.Panel.__init__(
self, frame, -1,
style=wx.TAB_TRAVERSAL|wx.CLIP_CHILDREN|wx.NO_FULL_REPAINT_ON_RESIZE
)
self.current = "http://wxPython.org/"
self.frame = frame
if frame:
self.titleBase = frame.GetTitle()
sizer = wx.BoxSizer(wx.VERTICAL)
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
self.ie = iewin.IEHtmlWindow(self, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE)
btn = wx.Button(self, -1, "Open", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnOpenButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
btn = wx.Button(self, -1, "Home", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnHomeButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
btn = wx.Button(self, -1, "<--", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnPrevPageButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
btn = wx.Button(self, -1, "-->", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnNextPageButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
btn = wx.Button(self, -1, "Stop", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnStopButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
btn = wx.Button(self, -1, "Search", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnSearchPageButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
btn = wx.Button(self, -1, "Refresh", style=wx.BU_EXACTFIT)
self.Bind(wx.EVT_BUTTON, self.OnRefreshPageButton, btn)
btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)
txt = wx.StaticText(self, -1, "Location:")
btnSizer.Add(txt, 0, wx.CENTER|wx.ALL, 2)
self.location = wx.ComboBox(
self, -1, "", style=wx.CB_DROPDOWN|wx.PROCESS_ENTER
)
self.Bind(wx.EVT_COMBOBOX, self.OnLocationSelect, self.location)
self.location.Bind(wx.EVT_KEY_UP, self.OnLocationKey)
self.location.Bind(wx.EVT_CHAR, self.IgnoreReturn)
btnSizer.Add(self.location, 1, wx.EXPAND|wx.ALL, 2)
sizer.Add(btnSizer, 0, wx.EXPAND)
sizer.Add(self.ie, 1, wx.EXPAND)
self.ie.LoadUrl(self.current)
self.location.Append(self.current)
self.SetSizer(sizer)
# Since this is a wxWindow we have to call Layout ourselves
self.Bind(wx.EVT_SIZE, self.OnSize)
# Hook up the event handlers for the IE window
self.Bind(iewin.EVT_NewWindow2, self.OnNewWindow2, self.ie)
self.Bind(iewin.EVT_DocumentComplete, self.OnDocumentComplete, self.ie)
##self.Bind(iewin.EVT_ProgressChange, self.OnProgressChange, self.ie)
self.Bind(iewin.EVT_StatusTextChange, self.OnStatusTextChange, self.ie)
self.Bind(iewin.EVT_TitleChange, self.OnTitleChange, self.ie)
def ShutdownDemo(self):
# put the frame title back
if self.frame:
self.frame.SetTitle(self.titleBase)
def OnSize(self, evt):
self.Layout()
def OnLocationSelect(self, evt):
url = self.location.GetStringSelection()
self.ie.Navigate(url)
def OnLocationKey(self, evt):
if evt.GetKeyCode() == wx.WXK_RETURN:
URL = self.location.GetValue()
self.location.Append(URL)
self.ie.Navigate(URL)
else:
evt.Skip()
def IgnoreReturn(self, evt):
if evt.GetKeyCode() != wx.WXK_RETURN:
evt.Skip()
def OnOpenButton(self, event):
dlg = wx.TextEntryDialog(self, "Open Location",
"Enter a full URL or local path",
self.current, wx.OK|wx.CANCEL)
dlg.CentreOnParent()
if dlg.ShowModal() == wx.ID_OK:
self.current = dlg.GetValue()
self.ie.Navigate(self.current)
dlg.Destroy()
def OnHomeButton(self, event):
self.ie.GoHome() ## ET Phone Home!
def OnPrevPageButton(self, event):
self.ie.GoBack()
def OnNextPageButton(self, event):
self.ie.GoForward()
def OnStopButton(self, evt):
self.ie.Stop()
def OnSearchPageButton(self, evt):
self.ie.GoSearch()
def OnRefreshPageButton(self, evt):
self.ie.Refresh(iewin.REFRESH_COMPLETELY)
def OnNewWindow2(self, evt):
# Veto the new window. Cancel is defined as an "out" param
# for this event. See iewin.py
evt.Cancel = True
def OnDocumentComplete(self, evt):
self.current = evt.URL
self.location.SetValue(self.current)
def OnTitleChange(self, evt):
if self.frame:
self.frame.SetTitle(self.titleBase + ' -- ' + evt.Text)
def OnStatusTextChange(self, evt):
if self.frame:
self.frame.SetStatusText(evt.Text)
if __name__ == '__main__':
app =wx.App()
okno = wx.Frame(None)
okno.CreateStatusBar()
TestPanel(okno)
okno.Show(True)
app.MainLoop()
toto funguje jako prohlížeč. Tudíž, ty můžeš vytvořit tabulku pomocí html a pak zobrazit celý text (včetně tabulky) pomocí self.ie.LoadString
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
To Blujacker : taky mě to napadlo, jen tak když jsem tohle hledal uvědomil jsem si že Python co se týče oken není až tak silněj v kramflecích
Lucius napsal:
To Blujacker : to s tym prehliadacom vyzera ako najlepsie riesenie ale ten kod mi nejde spustit
jakou ti to háže chybu?
Musíš mít nainstalovanou knihovnu wxWidgets. Hledej na googlu třeba "download wxPython"...
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
To Blujacker : hadze mi to takuto chybu
Traceback (most recent call last):
File "C:\Documents and Settings\WKPG\Desktop\Work\Appz\chryzantema\skuska", line 8, in <module>
import wx.lib.iewin as iewin
File "C:\Python25\Lib\site-packages\wx-2.8-msw-ansi\wx\lib\iewin.py", line 15, in <module>
import wx.lib.activex
File "C:\Python25\Lib\site-packages\wx-2.8-msw-ansi\wx\lib\activex.py", line 36, in <module>
import comtypes
ImportError: No module named comtypes
Hmm, zvláštní... Ten modul taky nemám, ale mě to žádnou chybu neháže a vše normálně funguje. Python 2.5.1, Wx 2.8.7.1 unicode
>>> import sys
>>> sys.version
'2.5.1 (r251:54863, May 1 2007, 17:47:05) [MSC v.1310 32 bit (Intel)]'
>>> import wx
>>> wx.version()
'2.8.7.1 (msw-unicode)'
>>> import comtypes
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
import comtypes
ImportError: No module named comtypes
>>>
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Asi to bude způsobeno rozdílnými verzemi wx, protože v mém activex.py se žádný comtypes neimportuje.
Uploadnul jsem svou verzi wx na http://www.blujacker.wz.cz/wx.exe
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
a odinstaloval jsi předtím starou verzi? Stačí smazat adresáře ze site-packages
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Rád jsem pomohl :smile2:
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Cyklus do...while v pythone — založil Tom@sQo
Cas v Pythone — založil nord
Force download v Pythone — založil kavva
P2P chat v pythone — založil namorblade
Nieco ako simple_xml v pythone — založil Tom@sQo
Moderátoři diskuze