def __init__(self, path='/'):
tv = ui.TableView()
tv.frame = self.bounds
tv.flex = 'WH'
ds = ui.ListDataSource([])
ds.action = self.item_selected
tv.data_source = ds
tv.delegate = ds
self.tableview = tv
self.add_subview(self.tableview)
self.name = 'Dropbox'
label = ui.Label(frame=self.bounds)
label.flex = 'WH'
label.background_color = (1, 1, 1, 0.95)
label.text = 'Loading...'
label.touch_enabled = True
label.alignment = ui.ALIGN_CENTER
self.path = path
self.add_subview(label)
self.status_label = label
self.canceled = False
python类ALIGN_CENTER的实例源码
def __init__(self, path='/'):
tv = ui.TableView()
tv.frame = self.bounds
tv.flex = 'WH'
ds = ui.ListDataSource([])
ds.action = self.item_selected
tv.data_source = ds
tv.delegate = ds
self.tableview = tv
self.add_subview(self.tableview)
self.name = 'Dropbox'
label = ui.Label(frame=self.bounds)
label.flex = 'WH'
label.background_color = (1, 1, 1, 0.95)
label.text = 'Loading...'
label.touch_enabled = True
label.alignment = ui.ALIGN_CENTER
self.path = path
self.add_subview(label)
self.status_label = label
self.canceled = False
def init_size(self): # initialize with correct size when landscape orientation = ui.WebView(frame=(0,0,100,200)).eval_js('window.orientation') if orientation in (-90, 90): self.frame = (0, 0, self.height, self.width)
def did_load(self): self.init_buttons() self.init_webbrowser() self.init_addressbar() self.init_size() self.flex = 'WH' self.bookmarks = self.load_bookmarks() self.history = self.load_history() self.addressbar_is_editing = False self.webpage_has_loaded = False self.favourite_images = {True :ui.Image.named('ionicons-ios7-star-32'), False:ui.Image.named('ionicons-ios7-star-outline-32')}
def save_history(self, filename=filename_history): with open(filename, 'w') as f: url = self.get_url() if url in self.history: self.history.remove(url) self.history.append(url) f.seek(0) pickle.dump(self.history, f) def clear_history(self, sender, filename=filename_history): with open(filename, 'w') as f: self.history = [] f.seek(0) pickle.dump(self.history, f) sender.superview.superview['history'].data_source.items = self.history sender.superview.superview['history'].reload()
def save_bookmark(self, filename=filename_bookmarks): with open(filename, 'w') as f: url = self.get_url() title = self.get_title() or self.parse_url(url) self.bookmarks[title] = url f.seek(0) json.dump(self.bookmarks, f, indent=4) self['controlpanel']['favourite'].image = self.favourite_images[True]
def remove_bookmark(self, title=None, filename=filename_bookmarks): with open(filename, 'w') as f: title = title or self.get_title() del self.bookmarks[title] f.seek(0) json.dump(self.bookmarks, f, indent=4) self['controlpanel']['favourite'].image = self.favourite_images[False]
def popup_menu(self): popup = ui.View(name='menu', frame=(0, 0, 320, 500)) toolbar = ui.View(frame=(-5, 0, 330, 100), name='toolbar') toolbar.border_width = 0.5 toolbar.border_color = '#B2B2B2' label = ui.Label() label.text = 'Bookmarks' label.alignment = ui.ALIGN_CENTER label.frame = (0, 0, 320, 50) label.name = 'title' segment_ctrl = ui.SegmentedControl(name='segctrl') segment_ctrl.segments = ['Bookmarks', 'History'] segment_ctrl.width = 170 segment_ctrl.center = popup.center segment_ctrl.y = label.height segment_ctrl.selected_index = 0 segment_ctrl.action = self.bookmarks_or_history button = ui.Button() button.frame = (segment_ctrl.x*3.5, segment_ctrl.y, 60, 30) button.font = ('<system>', 15) button.title= 'Clear' button.name = 'clear' button.action = self.clear_history button.hidden = True toolbar.add_subview(label) toolbar.add_subview(segment_ctrl) toolbar.add_subview(button) popup.add_subview(toolbar) data_source = ui.ListDataSource(sorted(self.bookmarks.keys())) popup.add_subview(self.list_bookmarks_and_history(data_source, width=320,height=toolbar.superview.height-toolbar.height, y=toolbar.height, name='bookmarks')) x, y = self['controlpanel']['bookmarks'].center popup.present('popover', popover_location=(x, y), hide_title_bar=True)
def bookmarks_or_history(self, sender): toolbar = sender.superview if sender.selected_index == 0: toolbar['clear'].hidden = True toolbar['title'].text = 'Bookmarks' data_source = ui.ListDataSource(sorted(self.bookmarks.keys())) tv = self.list_bookmarks_and_history(data_source, width=320, height=toolbar.superview.height-toolbar.height, y=toolbar.height, name='bookmarks') toolbar.superview.remove_subview(toolbar.superview['history']) else: toolbar['clear'].hidden = False toolbar['title'].text = 'History' data_source = ui.ListDataSource(self.history[::-1]) tv = self.list_bookmarks_and_history(data_source, width=320, height=toolbar.superview.height-toolbar.height, y=toolbar.height, name='history') toolbar.superview['bookmarks'].hidden=True toolbar.superview.remove_subview(toolbar.superview['bookmarks']) sender.superview.superview.add_subview(tv)
def list_bookmarks_and_history(self, data_source, **kwargs): tv = ui.TableView() tv.data_source = data_source tv.delegate = self for k, v in kwargs.items(): setattr(tv, k, v) return tv
def show_more_menu(self): popup = ui.TableView() popup.width = 250 popup.height = 500 popup.name = 'More' popup.data_source = popup.delegate = self button = self['controlpanel']['more'] popup.present('popover', popover_location=(button.x, button.y+button.height))
def button_tapped(self, sender): if sender.name == 'favourite': if self.get_url() in self.bookmarks.values(): self.remove_bookmark() else: self.save_bookmark() elif sender.name == 'bookmarks': self.popup_menu() elif sender.name == 'more': self.show_more_menu() else: eval("self['webview'].{}()".format(sender.name))
def tableview_number_of_rows(self, tableview, section): if tableview.name == 'Bookmarks': return len(self.bookmarks) elif tableview.name == 'More': return 1
def tableview_cell_for_row(self, tableview, section, row): if tableview.name == 'Bookmarks': cell = ui.TableViewCell() cell.text_label.text = sorted(self.bookmarks.keys())[row] cell.image_view.image = ui.Image.named('ionicons-ios7-bookmarks-outline-32') cell.image_view.tint_color = '#66CCFF' return cell elif tableview.name == 'More': cell = ui.TableViewCell() cell.text_label.text = 'Settings' cell.image_view.image = ui.Image.named('ionicons-wrench-32') return cell
@ui.in_background def tableview_did_select(self, tableview, section, row): if tableview.name == 'bookmarks': url = self.bookmarks[sorted(self.bookmarks.keys())[row]] self.load_url(url) tableview.superview.close() elif tableview.name == 'history': url = tableview.data_source.items[row] tableview.superview.close() self.load_url(url) elif tableview.name == 'More': tableview.close() console.hud_alert('No settings yet...', 'error', 1)
def tableview_can_delete(self, tableview, section, row): return True
def tableview_delete(self, tableview, section, row): item = sorted(self.bookmarks.keys())[row] self.remove_bookmark(item) tableview.reload()
def textfield_did_begin_editing(self, textfield): self.addressbar_is_editing = True self.set_url() self['controlpanel']['reload'].hidden = True
def textfield_did_end_editing(self, textfield): self.addressbar_is_editing = False self['controlpanel']['reload'].hidden = False self.set_url()
def textfield_should_return(self, textfield): url = self['controlpanel']['addressbar'].text self.load_url(url) textfield.end_editing() return True
def webview_did_start_load(self, webview): self.webpage_has_loaded = False
def webview_did_finish_load(self, webview): if not self.addressbar_is_editing: self.set_url() self.webpage_has_loaded = True page_is_bookmarked = unicode(self.get_url()) in self.bookmarks.values() self['controlpanel']['favourite'].image = self.favourite_images[page_is_bookmarked] self.save_history()
def set_menu(self, menu_key, spec):
menu_spec = spec[menu_key]
# for v in self.menu.subviews:
# self.menu.remove_subview(v)
#top_y = 50
x_increment = self.menu.width/(len(menu_spec)+1)
dim = 0.55*x_increment
for (i, (title, func)) in enumerate(menu_spec):
btn = ui.Button()
btn.title = title
btn.action = func
btn.background_color = self.menu_color
btn.tint_color = 'white'
self.menu.add_subview(btn)
btn.width = btn.height = dim
btn.center = ((i+1)*x_increment, self.menu.height/4)
btn.corner_radius = dim/2
# label = list(section.keys())[0]
# if isinstance(section[label], list):
# l = ui.Label(text=label, text_color='black', background_color=(1,1,1,0.5), alignment=ui.ALIGN_CENTER, frame=(0, top_y, self.button_width, self.button_height))
# #+self.button_gap)*(len(section[label])+1)))
# self.menu.add_subview(l)
# top_y += self.button_height + self.button_gap
# for (title, action) in section[label]:
# btn = self.menu_button(title, action, top_y)
# self.menu.add_subview(btn)
# btn.frame=(0, top_y, self.button_width, self.button_height)
# top_y += self.button_height + self.button_gap
# else:
# btn = self.menu_button(label, section[label], top_y)
# self.menu.add_subview(btn)
# btn.frame=(0, top_y, self.button_width, self.button_height)
# top_y += self.button_height + self.button_gap
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.name is not None:
title_label = ui.Label(text=self.name,
frame=(10, 0, 275, 25),
alignment=ui.ALIGN_CENTER,
font =('<system-bold>', 18))
self.add_subview(title_label)
def __init__(self, slider_name, convert, action, valuefmt, *args, **kwargs):
super().__init__(*args, **kwargs)
self._m = convert['m']
self._b = convert['b']
self._valuefmt = valuefmt
self.changed = action
self.name = slider_name
SLIDER_WIDTH = 200
SLIDER_HEIGHT = 30
SLIDER_TITLE_OFFSET = 25
SLIDER_TITLE_WIDTH = 200
SLIDER_TITLE_HEIGHT = 25
SLIDER_VALUE_OFFSET = 10
SLIDER_VALUE_HEIGHT = 25
SLIDER_VALUE_WIDTH = 50
self.border_width = 0
self.border_color = 'black'
self._slider = ui.Slider(frame=(0, SLIDER_TITLE_OFFSET, SLIDER_WIDTH, SLIDER_HEIGHT))
self._slider.continuous = False
self._slider.value = 0.5
self._slider.action = self.update
slider_title = ui.Label(frame=(0, 0, SLIDER_TITLE_WIDTH, SLIDER_TITLE_HEIGHT))
slider_title.text = slider_name
slider_title.text_color = 'black'
self._slider_valuelabel = ui.Label(frame=(SLIDER_WIDTH + SLIDER_VALUE_OFFSET, SLIDER_TITLE_OFFSET, SLIDER_VALUE_WIDTH, SLIDER_VALUE_HEIGHT))
self._slider_valuelabel.text = str(0.5)
self._slider_valuelabel.border_width = 1
self._slider_valuelabel.border_color = 'black'
self._slider_valuelabel.alignment = ui.ALIGN_CENTER
self.add_subview(self._slider)
self.add_subview(slider_title)
self.add_subview(self._slider_valuelabel)
def __init__(self, initial_width, initial_height, *args, **kwargs):
super().__init__(*args, **kwargs)
self._initial_width = initial_width
self._initial_height = initial_height
self.frame = (10, 100, 275, 250)
self.background_color = 'white'
self.img_width = ui.TextField(frame=(10, 30, 100, 25),
keyboard_type=ui.KEYBOARD_DECIMAL_PAD,
text=str(initial_width),
action=self.update_height)
self.add_subview(self.img_width)
width_label = ui.Label(frame=(10, 5, 150, 25), text='Image Width')
self.add_subview(width_label)
self.img_height = ui.TextField(frame=(150, 30, 100, 25),
keyboard_type=ui.KEYBOARD_DECIMAL_PAD,
text=str(initial_height),
action=self.update_width)
self.add_subview(self.img_height)
height_label = ui.Label(frame=(150, 5, 150, 25), text='Image Height')
self.add_subview(height_label)
aspect_ratio = self._initial_width / self._initial_height
self.aspect = ui.TextField(frame=(70, 100, 150, 25),
text=str(aspect_ratio),
keyboard_type=ui.KEYBOARD_DECIMAL_PAD,
alignment=ui.ALIGN_CENTER,
action=self.updatefrom_aspectratio)
self.add_subview(self.aspect)
aspect_label = ui.Label(frame=(70, 75, 150, 25),
text='Aspect',
alignment=ui.ALIGN_CENTER)
self.add_subview(aspect_label)
self.save_button = ui.Button(frame=(175, 150, 50, 25),
title='Save',
action=self.save)
self.add_subview(self.save_button)
self.cancel_button = ui.Button(frame=(30, 150, 50, 25),
title='Cancel',
action=self.cancel)
self.add_subview(self.cancel_button)
def make_label(text, frame):
label = ui.Label( )
label.text = str(text)
label.frame = frame
label.text_color = 'black'
label.border_color = 'black'
label.alignment = ui.ALIGN_CENTER
label.border_width = 1
label.bring_to_front()
return label
def create_label(title):
global label_count
label_count += 1
label_w = 175
label_h = 75
gap = 10
label_w_with_gap = label_w + gap
label_h_with_gap = label_h + gap
labels_per_line = math.floor((v.width-2*gap)/(label_w+gap))
left_margin = (v.width - labels_per_line*label_w_with_gap + gap)/2
line = math.floor(label_count/labels_per_line)
column = label_count - line*labels_per_line
l = ui.Label(
text=title,
background_color='grey',
text_color='white',
alignment=ui.ALIGN_CENTER,
number_of_lines=0,
frame=(
left_margin+column * label_w_with_gap,
gap+line * label_h_with_gap,
label_w, label_h
))
v.add_subview(l)
return l
def tableview_cell_for_row(self, tableview, section, row):
cell = ui.TableViewCell()
cell.text_label.text = str(self.items[row])
cell.text_label.alignment = ui.ALIGN_CENTER
return cell
def make_right_side_view(cls, right_frame):
text_view = ui.TextView(frame=right_frame)
text_view.alpha = cls.views_alpha
text_view.alignment = ui.ALIGN_CENTER
text_view.editable = False
text_view.text = '\n' + '1234567890 ' * 50
return text_view
def make_status_view(cls, status_frame):
text_view = ui.TextView(frame=status_frame)
text_view.alpha = cls.views_alpha
text_view.alignment = ui.ALIGN_CENTER
text_view.editable = False
text_view.text = "Status: let the game begin... It is white's turn to move"
return text_view
def to_css_alignment(self):
mapping = { ui.ALIGN_LEFT: 'left', ui.ALIGN_CENTER: 'center', ui.ALIGN_RIGHT: 'right', ui.ALIGN_JUSTIFIED: 'justify', ui.ALIGN_NATURAL: 'start' }
return mapping[self.markup.alignment]
Three-Column-Sortable-TableView.py 文件源码
项目:pythonista-scripts
作者: khilnani
项目源码
文件源码
阅读 17
收藏 0
点赞 0
评论 0
def make_labels(self, cell, text, pos):
label = ui.Label()
label.border_color = 'lightgrey'
label.border_width = 0.5
if pos == 2:
label.text = str(datetime.datetime.fromtimestamp(text))
else:
label.text = str(text)
label.frame = (pos*self.width/3,0,self.width/3,self.row_height)
label.alignment = ui.ALIGN_CENTER
cell.content_view.add_subview(label)
def parse_alignment(a):
'''handle alignment attribute. TODO: handle all valid types'''
if a=='left':
return ui.ALIGN_LEFT
elif a=='right':
return ui.ALIGN_RIGHT
elif a=='center':
return ui.ALIGN_CENTER
else: #fixme... handle all types.
print 'unhandled alignment',a
return ui.ALIGN_LEFT
def display_toast(view, help_text, width = 220, height = 110, show_duration=2, fade_duration=0.5, background_colour=(.42, .42, .42), text_colour= (.96, .96, .96), corner_radius=10):
w, h = ui.get_screen_size()
help_view = ui.View(frame=((w/2)-(width/2),(h/2)-height, width, height))
help_view.background_color = background_colour
help_view.corner_radius = corner_radius
label = ui.Label()
label.text = help_text
label.flex = 'H'
label.width = help_view.width * 0.9
label.alignment = ui.ALIGN_CENTER
label.x = (help_view.width / 2) - (label.width / 2)
label.y = (help_view.height / 2) - (label.height / 2)
label.number_of_lines = 3
label.text_color = text_colour
help_view.add_subview(label)
def animation_fade_in():
help_view.alpha = 1.0
def animation_fade_out():
help_view.alpha = 0.0
help_view.alpha = 0.0
view.add_subview(help_view)
ui.animate(animation_fade_in, duration=fade_duration)
time.sleep(show_duration+fade_duration)
ui.animate(animation_fade_out, duration=fade_duration)
time.sleep(fade_duration)
view.remove_subview(help_view)
def main():
global main_view
delegate = MetadataDelegate.new()
main_view = ui.View(frame=(0, 0, 400, 400))
main_view.name = 'Barcode Scanner'
session = AVCaptureSession.alloc().init()
device = AVCaptureDevice.defaultDeviceWithMediaType_('vide')
_input = AVCaptureDeviceInput.deviceInputWithDevice_error_(device, None)
if _input:
session.addInput_(_input)
else:
print('Failed to create input')
return
output = AVCaptureMetadataOutput.alloc().init()
queue = ObjCInstance(dispatch_get_current_queue())
output.setMetadataObjectsDelegate_queue_(delegate, queue)
session.addOutput_(output)
output.setMetadataObjectTypes_(output.availableMetadataObjectTypes())
prev_layer = AVCaptureVideoPreviewLayer.layerWithSession_(session)
prev_layer.frame = ObjCInstance(main_view).bounds()
prev_layer.setVideoGravity_('AVLayerVideoGravityResizeAspectFill')
ObjCInstance(main_view).layer().addSublayer_(prev_layer)
label = ui.Label(frame=(0, 0, 400, 30), flex='W', name='label')
label.background_color = (0, 0, 0, 0.5)
label.text_color = 'white'
label.text = 'Nothing scanned yet'
label.alignment = ui.ALIGN_CENTER
main_view.add_subview(label)
session.startRunning()
main_view.present('sheet')
main_view.wait_modal()
session.stopRunning()
delegate.release()
session.release()
output.release()
if found_codes:
print 'All scanned codes:\n' + '\n'.join(found_codes)
def draw(self):
square_size=min(self.width,self.height)
N=self.N
Nb=self.Nb
dx=square_size*1.0/(N+2)
dxb=N*dx/Nb
h,s,v=self.current
i0,j0,k0=(round(c*N) for c in self.current)
k0=round(self.current[2]*Nb)
#draw H/S grid
for i in xrange(0,N):
for j in xrange(0,N):
ui.set_color(colorsys.hsv_to_rgb(i*1.0/N,j*1.0/N,v))
ui.set_blend_mode(ui.BLEND_NORMAL)
ui.fill_rect(round(i*dx),round(j*dx),round(dx),round(dx))
#draw V slider
for k in xrange(0,Nb):
ui.set_color(colorsys.hsv_to_rgb(h,s,k*1./Nb))
ui.set_blend_mode(ui.BLEND_NORMAL)
ui.fill_rect(round((N+1)*dx),round(k*dxb),round(dx),round(dxb+0.5))
#highlight selection
if all([c>=0 for c in self.current]):
ui.set_color(colorsys.hsv_to_rgb(h,s,1-0.5*(1-v)))
p=ui.Path.rect(i0*dx,j0*dx,dx,dx)
p.line_width=4
p.stroke()
ui.set_color(colorsys.hsv_to_rgb(h,s,1-0.5*(1-v)))
p=ui.Path.rect((N+1)*dx,k0*dxb,dx,dxb)
p.line_width=4
p.stroke()
#preview
ui.set_color(colorsys.hsv_to_rgb(h,s,v))
ui.fill_rect(0,(N+1)*dx,6*dx,dx)
r,g,b=colorsys.hsv_to_rgb(h,s,v)
clip=lambda x:min(max(x,0),1)
rp,gp,bp=colorsys.hsv_to_rgb(1-h,1,clip((0.5-v)*100))
ui.draw_string( ('{:02x}'*3).format(int(r*255),int(g*255),int(b*255)), (0,(N+1)*dx,6*dx,dx),alignment=ui.ALIGN_CENTER,color=(rp,gp,bp))
def draw(self):
# redraw button
def darken(color):
return tuple([0.5*x for x in color])
#set up button size to fit.
padding=10
textsize=ui.measure_string(string=self.title,max_width=0,font=self.font,alignment=ui.ALIGN_CENTER)
#draw border
ui.set_color(self.border_color)
path = ui.Path.rounded_rect(0, 0, self.width, self.height,self.corner_radius)
path.line_width=self.border_width
path.stroke()
#fill button, depending on touch state
if self.touched:
if self.doing_longtouch:
ui.set_color('blue')
else:
ui.set_color('grey')
else :
ui.set_color(self.bg_color)
path.fill()
# fill corner darker, if has children
if self.flow.subviews:
corner = ui.Path()
corner.move_to(self.width-1.5*self.corner_radius,0)
corner.line_to(self.width,0)
corner.line_to(self.width,1.5*self.corner_radius)
corner.line_to(self.width-1.5*self.corner_radius,0)
ui.set_color(darken(darken(self.bg_color)))
corner.stroke()
corner.fill()
# draw title, center vertically, horiz
rect=list(self.bounds)
rect[1]=(rect[3]-textsize[1])/2 #vert center
rect[2]=max(rect[2],textsize[0]+10)
ui.draw_string(self.title, rect=tuple(rect), font=self.font, color=self.tint_color, alignment=ui.ALIGN_CENTER, line_break_mode=ui.LB_WORD_WRAP)
if textsize[0]>self.bounds[2]:
self.width=textsize[0]+10
def __init__(self, container, state):
self._container = container
self._touch_began_location = None
self._initial_container_frame = None
self._container_superview = ObjCInstance(container).superview()
label = LayoutProxy(ui.Label())
label.font = ('<system>', 13.0)
label.alignment = ui.ALIGN_CENTER
label.text_color = get_theme_value('bar_title_color')
label.touch_enabled = False
self.add_subview(label)
label.layout.align_left_with_superview.equal = 0
label.layout.align_right_with_superview.equal = 0
label.layout.align_center_y_with_superview.equal = 0
self.title_label = label
button = LayoutProxy(ui.Button(title='x', tint_color=get_theme_value('tint_color')))
self.add_subview(button)
button.layout.align_left_with_superview.equal = 0
button.layout.align_top_with_superview.equal = 0
button.layout.align_bottom_with_superview.equal = 0
button.layout.width.equal = _OVERLAY_BAR_HEIGHT
self.close_button = button
button = LayoutProxy(ui.Button(title='-', tint_color=get_theme_value('tint_color')))
self.add_subview(button)
button.layout.align_right_with_superview.equal = 0
button.layout.align_top_with_superview.equal = 0
button.layout.align_bottom_with_superview.equal = 0
button.layout.width.equal = _OVERLAY_BAR_HEIGHT
self.collapse_button = button
separator = LayoutProxy(ui.View(background_color=get_theme_value('separator_color')))
self.add_subview(separator)
separator.layout.height.equal = 1
separator.layout.align_left_with_superview.equal = 0
separator.layout.align_bottom_with_superview.equal = 0
separator.layout.align_right_with_superview.equal = 0
self.separator = separator
self.update_appearance(state)
def __init__(self, **kwargs):
super().__init__(**kwargs)
if 'background_color' not in kwargs:
self.background_color = 'white'
if 'frame' not in kwargs:
self.width = min(ui.get_window_size()[0] * 0.8, 700)
self.height = ui.get_window_size()[1] * 0.8
self._tableview = ui.TableView()
self._textfield = ui.TextField()
self._help_label = ui.Label()
self._datasource = None
self._handlers = None
self.shift_enter_enabled = True
self.did_select_item_action = None
tf = LayoutProxy(self._textfield)
self.add_subview(tf)
tf.layout.align_left_with_superview.equal = 8
tf.layout.align_top_with_superview.equal = 8
tf.layout.align_right_with_superview.equal = -8
tf.layout.height.equal = 31
tf.delegate = self
tv = LayoutProxy(self._tableview)
self.add_subview(tv)
tv.layout.align_left_to(tf).equal = 0
tv.layout.align_right_to(tf).equal = 0
tv.layout.top_offset_to(tf).equal = 8
tv.allows_selection = True
tv.allows_multiple_selection = False
hl = LayoutProxy(self._help_label)
self.add_subview(hl)
hl.layout.align_left_to(tv).equal = 0
hl.layout.align_right_to(tv).equal = 0
hl.layout.top_offset_to(tv).equal = 8
hl.layout.align_bottom_with_superview.equal = -8
hl.layout.height.max = 66
hl.font = ('<system>', 13.0)
hl.alignment = ui.ALIGN_CENTER
hl.text_color = (0, 0, 0, 0.5)
hl.number_of_lines = 2
if is_in_hardware_keyboard_mode:
tf.view.begin_editing()
self._register_key_event_handlers()