class A_DWI: def __init__(self, container, frame, label='', text='', row=0, column=0): self.container = container self.is_b0 = BooleanVar(container.parent) self.is_dw = BooleanVar(container.parent) self.column = column self.direction = StringVar(container.parent) self.label_from = Label(frame, text='from') self.text_from = Entry(frame) self.text_from.insert(0, text) self.button_file_from = Button(frame, text='...', command=lambda:filenameDialog_text(self.text_from)) self.button_rm = Button(frame, text='remove', command=self.click_remove) self.radio_ap = Radiobutton(frame, text='AP', variable=self.direction, value='AP', command=self.set_direction) self.radio_pa = Radiobutton(frame, text='PA', variable=self.direction, value='PA', command=self.set_direction) self.label_to = Label(frame, text='to') self.text_to = Entry(frame) #self.text_to.insert(0, text) self.button_file_to = Button(frame, text='Gen', command=self.set_filename_to) self.check_b0 = Checkbutton(frame, text='B0', variable=self.is_b0) self.check_dw = Checkbutton(frame, text='DWI', variable=self.is_dw) self.button_up = Button(frame, text='up', width=3, command=self.click_up) self.button_dn = Button(frame, text='down', width=3, command=self.click_dn) self.row = -1 self.change_row(row) if text != '': self.set_appa() self.set_filename_to() def prefix(self): return self.container.parent.prefix() def set_direction(self): pass def get_dwi_filenames(self): ''' :return: [('from', 'to'), ('from', 'to')] ''' filename_from = self.text_from.get() filename_to = self.text_to.get() if self.is_dw.get(): rtn = [ [filename_from, filename_to] ] filename_b_from = filename_wo_ext(filename_from) filename_b_to = filename_wo_ext(filename_to) rtn.append( [filename_b_from+'.bval', filename_b_to+'.bval'] ) rtn.append( [filename_b_from+'.bvec', filename_b_to+'.bvec'] ) return rtn return [] def get_b0_filename(self): ''' :return: [('from', 'to')] ''' filename_from = self.text_from.get() filename_to = self.text_to.get() ext = extname(filename_to) if self.is_b0.get(): if self.is_dw.get(): filename_to = '%s_B0%s' % (filename_wo_ext(filename_to), ext) return [ [filename_from, filename_to] ] return [] def set_appa(self): filename_from = self.text_from.get() basename_from = os.path.basename(filename_from) basename_b_from = filename_wo_ext(basename_from) if 'pa' in basename_b_from.lower(): self.direction.set('PA') elif 'ap' in basename_b_from.lower(): self.direction.set('AP') else: pass def set_filename_to(self, middle=None): filename_from = self.text_from.get() basename_from = os.path.basename(filename_from) number = os.path.dirname(filename_from).split('/')[-1].split('_')[0] if number == '': number = str(self.row) else: try: int(number) except: number = str(self.row) ext = extname(basename_from) intermediate = self.direction.get() if intermediate == '': intermediate = 'DWI' if self.is_b0.get() and not self.is_dw.get(): intermediate += '_B0' self.text_to.delete(0, len(self.text_to.get())) self.text_to.insert(0, '%s%s_%s%s' % (self.prefix(), number, intermediate, ext)) def change_row(self, row): if self.row == row: return self.row = row i = 2*row j = self.column j += 0; self.button_up.grid(row=i, column=j) j += 1; self.label_from.grid(row=i, column=j) j += 1; self.text_from.grid(row=i, column=j, sticky=EW) j += 1; self.button_file_from.grid(row=i, column=j) j += 1; self.button_rm.grid(row=i, column=j) j += 1; self.radio_ap.grid(row=i, column=j) j += 1; self.radio_pa.grid(row=i, column=j) i += 1 j = 0 j += 0; self.button_dn.grid(row=i, column=j) j += 1; self.label_to.grid(row=i, column=j) j += 1; self.text_to.grid(row=i, column=j, sticky=EW) j += 1; self.button_file_to.grid(row=i, column=j) j += 1 j += 1; self.check_b0.grid(row=i, column=j) j += 1; self.check_dw.grid(row=i, column=j) def click_remove(self): self.container.remove(self.row) self.button_up.destroy() self.label_from.destroy() self.text_from.destroy() self.button_file_from.destroy() self.button_rm.destroy() self.radio_ap.destroy() self.radio_pa.destroy() self.button_dn.destroy() self.label_to.destroy() self.text_to.destroy() self.button_file_to.destroy() self.check_b0.destroy() self.check_dw.destroy() def click_up(self): self.container.up(self.row) def click_dn(self): self.container.dn(self.row)
class Nono_Main(Frame): ''' It is GUI for player to choose nonogram, or to import from text file or picture ''' def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): ''' Loades nonograms from Nonogram base.txt file, fills list of nonograms and creates all widgets within GUI ''' self.parent.title("Nonograms") base_nonograms = import_from_file("Nonogram base.txt") self.all_nonograms = [] menubar = tk.Menu(self.parent) self.parent.config(menu=menubar) self.fl = "" fileMenu = tk.Menu(menubar) fileMenu.add_command(label="Export", command=self.export) fileMenu.add_command(label="Open", command=self.onOpen) fileMenu.add_command(label="Exit", command=self.onExit) menubar.add_cascade(label="File", menu=fileMenu) self.pack(fill=tk.BOTH, expand=1) nonos = [] for n in range(len(base_nonograms['unique'])): nonos.append('Nonogram ' + str(len(self.all_nonograms) + n)) self.all_nonograms += base_nonograms['unique'] for n in range(len(base_nonograms['nonunique'])): nonos.append('NUS Nonogram ' + str(len(self.all_nonograms) + n)) self.all_nonograms += base_nonograms['nonunique'] for n in range(len(base_nonograms['hard'])): nonos.append('HARD Nonogram ' + str(len(self.all_nonograms) + n)) self.all_nonograms += base_nonograms['hard'] self.lb = tk.Listbox(self) for i in nonos: self.lb.insert(tk.END, i) self.lb.bind("<<ListboxSelect>>", self.onSelect) self.lb.place(x=20, y=40) info1 = Label(self, text='Select nonogram:') info1.place(x=30, y=10) info2 = Label(self, text='Or choose a file:') info2.place(x=180, y=10) self.browseButton = tk.Button(self, text='Browse...', command=self.onBrowse) self.browseButton.place(x=200, y=30) self.info3 = Label(self, text="") self.info3.place(x=150, y=60) self.info4 = Label(self, text="Rows:") self.ySize = tk.Entry(self, width=5) def onSelect(self, val): ''' When player selects nonogram from list, new window appears with this particular nonogram. ''' sender = val.widget num = sender.curselection()[0] current_nonogram = self.all_nonograms[num] master = tk.Tk() if 'HARD' not in sender.get(sender.curselection())\ and 'Picture' not in sender.get(sender.curselection()): current_nonogram.solve() current_nonogram.full_solve() app = ShowNono(master, current_nonogram.Rows, current_nonogram.Columns, current_nonogram.nonogram_Matrix, current_nonogram.pair) app.mainloop() else: app = ShowNonoHard(master, current_nonogram.Rows, current_nonogram.Columns) app.mainloop() def onBrowse(self): ''' Opens filedialog window, so player can choose text file or picture to add nonograms. In the second case player is asked to give dimensions of picture he wants to solve. WARNING! Image size ratio cannot be changed! So if original picture has resolution 900x900 and players gives X = 10, Y = 100 picture will be converted to X = 100 and Y = 100, to retain size ratio and to match Y. ''' if self.ySize: self.ySize.destroy() if self.info4: self.info4.destroy() ftypes = [('Text files', '*.txt'), ('Pictures', '*.jpg; *.png; *.bmp')] dlg = filedialog.Open(self, filetypes=ftypes) self.fl = dlg.show() sss = self.fl.split("/") self.info3.configure(text=sss[-1]) if self.fl[-3:] == "txt": self.convert = tk.Button(self, text='Convert', command=self.converty) self.convert.place(x=200, y=160) elif self.fl[-3:] in ['jpg', 'png', 'bmp']: self.ySize = tk.Entry(self, width=5) self.ySize.place(x=210, y=100) self.info4 = Label(self, text="Rows:") self.info4.place(x=150, y=100) self.convert = tk.Button(self, text='Convert', command=self.converty) self.convert.place(x=200, y=160) def converty(self): ''' Imports and adds to list nonograms from file, or converts picture to nonogram and adds it to the list. ''' if self.fl[-3:] == "txt": base_nonograms = import_from_file(self.fl) name = self.fl.split("/")[-1].split(".")[0] nonos = [] for n in range(len(base_nonograms['unique'])): nonos.append('My ' + name + ' ' + str(len(self.all_nonograms) + n)) self.all_nonograms += base_nonograms['unique'] for n in range(len(base_nonograms['nonunique'])): nonos.append('My NUS ' + name + ' ' + str(len(self.all_nonograms) + n)) self.all_nonograms += base_nonograms['nonunique'] for n in range(len(base_nonograms['hard'])): nonos.append('HARD ' + name + ' ' + str(len(self.all_nonograms) + n)) self.all_nonograms += base_nonograms['hard'] for i in nonos: self.lb.insert(tk.END, i) elif self.fl[-3:] in ['jpg', 'png', 'bmp']: name = self.fl.split("/")[-1].split(".")[0] rows, cols = import_picture(self.fl, int(self.ySize.get()), int(self.ySize.get())) ngram = nonogram(rows, cols) self.lb.insert( tk.END, "Picture " + name + ' ' + str(len(self.all_nonograms))) self.all_nonograms.append(ngram) self.ySize.destroy() self.info4.destroy() self.convert.destroy() self.info3.configure(text="") def onOpen(self): self.onBrowse() def onExit(self): self.parent.destroy() def export(self): ''' Saves all nonograms from the list to "Nonogram base.txt" so they will be loaded on next opening. ''' text = [ str(nonogram.Rows) + '\n' + str(nonogram.Columns) for nonogram in self.all_nonograms ] new_text = '\n\n'.join(text) f = open('Nonogram base.txt', 'w') f.write(new_text) f.close